about_Parsing
Kısa açıklama
PowerShell'in komutları nasıl ayrıştırdığı açıklanır.
Uzun açıklama
Komut istemine bir komut girdiğinizde, PowerShell komut metnini belirteç adı verilen bir kesim dizisine böler ve sonra her belirtecin nasıl yorumleneceğini belirler.
Örneğin, şunu yazarsanız:
Write-Host book
PowerShell, Write-Host
book
komutu ve iki belirtece böler ve iki ana ayrıştırma modundan birini kullanarak her belirteci bağımsız olarak yorumlar: ifade modu ve bağımsız değişken modu.
Not
PowerShell komut girişini ayrıştırdıkça komut adlarını cmdlet'lere veya yerel yürütülebilir dosyalara çözümlemeye çalışır. Bir komut adının tam eşleşmesi yoksa, PowerShell Get-
komutu varsayılan fiil olarak ekler. Örneğin, PowerShell olarak Get-Service
ayrıştırıyorService
. Bu özelliğin aşağıdaki nedenlerle kullanılması önerilmez:
- Bu verimsiz. Bu, PowerShell'in birden çok kez aramasına neden olur.
- Önce aynı ada sahip dış programlar çözümlenir, bu nedenle istenen cmdlet'i yürütemeyebilirsiniz.
Get-Help
veGet-Command
fiilsiz adları tanımaz.- Komut adı ayrılmış bir sözcük veya dil anahtar sözcüğü olabilir.
Process
her ikisi de olur ve ileGet-Process
çözülemez.
İfade modu
İfade modu, bir betik dilinde değer işleme için gerekli olan ifadeleri birleştirmeye yöneliktir. İfadeler PowerShell söz dizimindeki değerlerin temsilleridir ve basit veya bileşik olabilir, örneğin:
Değişmez değer ifadeleri, değerlerinin doğrudan temsilleridir:
'hello'
32
Değişken ifadeleri başvurdıkları değişkenin değerini taşır:
$x
$script:path
İşleçler değerlendirme için diğer ifadeleri birleştirir:
-12
-not $Quiet
3 + 7
$input.Length -gt 1
- Karakter dizesi değişmez değerleri tırnak içinde bulunmalıdır.
- Sayılar , bir karakter dizisi olarak değil sayısal değerler olarak değerlendirilir (çıkış yapılmadığı sürece).
- ve
-not
gibi birli işleçler ve ve gibi-
ikili işleçler de+
-gt
dahil olmak üzere işleçler işleçler işleç olarak yorumlanır ve ilgili işlemlerini bağımsız değişkenlerine (işlenenler) uygular. - Öznitelik ve dönüştürme ifadeleri ifade olarak ayrıştırılır ve alt ifadelere uygulanır. Örneğin:
[int] '7'
. - Değişken başvuruları değerlerine göre değerlendirilir, ancak sıçrama yasaktır ve ayrıştırıcı hatasına neden olur.
- Diğer her şey çağrılacak bir komut olarak değerlendirilir.
Bağımsız değişken modu
Ayrıştırma sırasında PowerShell ilk olarak girişi bir ifade olarak yorumlamaya bakar. Ancak bir komut çağrısıyla karşılaşıldığında ayrıştırma bağımsız değişken modunda devam eder. Yollar gibi boşluklar içeren bağımsız değişkenleriniz varsa, bu bağımsız değişken değerlerini tırnak içine almanız gerekir.
Bağımsız değişken modu, bir kabuk ortamındaki komutlar için bağımsız değişkenleri ve parametreleri ayrıştırma için tasarlanmıştır. Tüm girişler, aşağıdaki söz dizimlerinden birini kullanmadığı sürece genişletilebilir bir dize olarak değerlendirilir:
Dolar işareti (
$
) ve ardından değişken adı bir değişken başvurusu başlar, aksi takdirde genişletilebilir dizenin bir parçası olarak yorumlanır. Değişken başvurusu üye erişimi veya dizin oluşturma içerebilir.- gibi
$HOME
basit değişken başvurularını izleyen ek karakterler aynı bağımsız değişkenin parçası olarak kabul edilir. Değişken adını sonraki karakterlerden ayırmak için ayraç ({}
) içine alın. Örneğin,${HOME}
. - Değişken başvurusu üye erişimi içerdiğinde, ek karakterlerin ilki yeni bir bağımsız değişkenin başlangıcı olarak kabul edilir. Örneğin
$HOME.Length-more
, iki bağımsız değişkenle sonuç verir: değeri$HOME.Length
ve dize değişmez değeri-more
.
- gibi
Tırnak işaretleri (
'
ve"
) başlangıç dizeleriAyraçlar (
{}
) yeni betik blokları başlatırÇağrılan komut yerel bir uygulama olmadığı sürece, virgüller (
,
) dizi olarak geçirilen listeleri tanıtır; bu durumda bunlar genişletilebilir dizenin bir parçası olarak yorumlanır. İlk, ardışık veya sondaki virgüller desteklenmez.Parantezler (
()
) yeni bir ifade başlatırAlt ifade işleci (
$()
) eklenmiş ifadeyi başlatırbaşlangıçtaki işaret (
@
), sıçrama (), diziler (@args
@(1,2,3)
) ve karma tablo değişmez değerleri (@{a=1;b=2}
) gibi ifade söz dizilerini başlatır.()
,$()
ve@()
belirtecin başında ifadeler veya iç içe komutlar içerebilen yeni bir ayrıştırma bağlamı oluşturur.- Ardından ek karakterler geldiğinde, ilk ek karakter yeni, ayrı bir bağımsız değişkenin başlangıcı olarak kabul edilir.
- Önüne genişletilebilir bir dize gibi okunmamış değişmez değer eklendiğinde
$()
,()
ifade olan yeni bir bağımsız değişken başlatır ve@()
ifade olan yeni bir bağımsız değişken başlatılarak()
değişmez değer@
olarak alınır.
Diğer her şey, yine de kaçması gereken meta karakter dışında genişletilebilir bir dize olarak değerlendirilir. Bkz. Özel karakterleri işleme.
- Bağımsız değişken modu meta karakterlerini (özel bir sözcük temelli karakterler) şunlardır:
<space> ' " ` , ; ( ) { } | & < > @ #
. Bunlardan yalnızca< > @ #
belirtecin başında özeldir.
- Bağımsız değişken modu meta karakterlerini (özel bir sözcük temelli karakterler) şunlardır:
Ayrıştırmayı durdurma belirteci (
--%
), kalan tüm bağımsız değişkenlerin yorumlanmasını değiştirir. Daha fazla bilgi için aşağıdaki belirteç ayrıştırmayı durdurma bölümüne bakın.
Örnekler
Aşağıdaki tabloda, ifade modunda ve bağımsız değişken modunda işlenen belirteçlerin birkaç örneği ve bu belirteçlerin değerlendirilmesi sağlanır. Bu örnekler için değişkeninin $a
değeri şeklindedir 4
.
Örnek | Mod | Sonuç |
---|---|---|
2 |
Expression | 2 (tamsayı) |
`2 |
Expression | "2" (komut) |
Write-Output 2 |
Expression | 2 (tamsayı) |
2+2 |
Expression | 4 (tamsayı) |
Write-Output 2+2 |
Bağımsız değişken | "2+2" (dize) |
Write-Output(2+2) |
Expression | 4 (tamsayı) |
$a |
Expression | 4 (tamsayı) |
Write-Output $a |
Expression | 4 (tamsayı) |
$a+2 |
Expression | 6 (tamsayı) |
Write-Output $a+2 |
Bağımsız değişken | "4+2" (dize) |
$- |
Bağımsız değişken | "$-" (komut) |
Write-Output $- |
Bağımsız değişken | "$-" (dize) |
a$a |
Expression | "a$a" (komut) |
Write-Output a$a |
Bağımsız değişken | "a4" (dize) |
a'$a' |
Expression | "a$a" (komut) |
Write-Output a'$a' |
Bağımsız değişken | "a$a" (dize) |
a"$a" |
Expression | "a$a" (komut) |
Write-Output a"$a" |
Bağımsız değişken | "a4" (dize) |
a$(2) |
Expression | "a$(2)" (komut) |
Write-Output a$(2) |
Bağımsız değişken | "a2" (dize) |
Her belirteç Boole veya String gibi bir tür nesne türü olarak yorumlanabilir. PowerShell, ifadeden nesne türünü belirlemeye çalışır. Nesne türü, bir komutun beklediği parametrenin türüne ve PowerShell'in bağımsız değişkeni doğru türe nasıl dönüştüreceklerini bilip bilmediğine bağlıdır. Aşağıdaki tabloda, ifadeler tarafından döndürülen değerlere atanan türlerin çeşitli örnekleri gösterilmektedir.
Örnek | Mod | Sonuç |
---|---|---|
Write-Output !1 |
tartışma | "!1" (dize) |
Write-Output (!1) |
ifade | False (Boole) |
Write-Output (2) |
ifade | 2 (tamsayı) |
Set-Variable AB A,B |
tartışma | 'A','B' (dizi) |
CMD /CECHO A,B |
tartışma | 'A,B' (dize) |
CMD /CECHO $AB |
ifade | 'A B' (dizi) |
CMD /CECHO :$AB |
tartışma | ':A B' (dize) |
Özel karakterleri işleme
Bir ifadedeki herhangi bir özel karakterden kaçmak için backtick karakteri (`
) kullanılabilir. Bu, en çok meta karakter yerine sabit karakter olarak kullanmak istediğiniz bağımsız değişken modu meta karakterlerinden kaçmak için kullanışlıdır. Örneğin, genişletilebilir bir dizede değişmez değer olarak dolar işaretini ($
) kullanmak için:
"The value of `$ErrorActionPreference is '$ErrorActionPreference'."
The value of $ErrorActionPreference is 'Continue'.
Satır devamlılığı
Arka uç karakteri, girişi bir sonraki satırda devam etmenizi sağlamak için satırın sonunda da kullanılabilir. Bu, uzun adlara ve bağımsız değişken değerlerine sahip birkaç parametre alan bir komutun okunabilirliğini artırır. Örneğin:
New-AzVm `
-ResourceGroupName "myResourceGroupVM" `
-Name "myVM" `
-Location "EastUS" `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "myPublicIpAddress" `
-Credential $cred
Ancak, satır devamlılığı kullanmaktan kaçınmanız gerekir.
- Backtick karakterlerini görmek zor olabilir ve kolayca unutabilirsiniz.
- Arka uç satır devamını kırdıktan sonra fazladan bir boşluk. Alanı görmek zor olduğundan hatayı bulmak zor olabilir.
PowerShell, söz diziminde doğal noktalarda çizgileri kesmenin çeşitli yollarını sağlar.
- Kanal karakterlerini (
|
) sonra - İkili işleçler (
+
,-
,-eq
vb.) sonra - Dizide virgülden (
,
) sonra - ,
{
, gibi[
karakterleri açtıktan sonra(
Büyük parametre kümesi için bunun yerine sıçramayı kullanın. Örneğin:
$parameters = @{
ResourceGroupName = "myResourceGroupVM"
Name = "myVM"
Location = "EastUS"
VirtualNetworkName = "myVnet"
SubnetName = "mySubnet"
SecurityGroupName = "myNetworkSecurityGroup"
PublicIpAddressName = "myPublicIpAddress"
Credential = $cred
}
New-AzVm @parameters
Bağımsız değişkenleri yerel komutlara geçirme
PowerShell'den yerel komutlar çalıştırılırken, bağımsız değişkenler önce PowerShell tarafından ayrıştırılır. Ayrıştırılan bağımsız değişkenler daha sonra her parametre bir boşlukla ayrılmış olarak tek bir dizede birleştirilir.
Örneğin, aşağıdaki komut programı çağırır icacls.exe
.
icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
Bu komutu PowerShell 2.0'da çalıştırmak için, PowerShell'in parantezleri yanlış yorumlamasını önlemek için kaçış karakterlerini kullanmanız gerekir.
icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F
Ayrıştırmayı durdurma belirteci
PowerShell 3.0'dan başlayarak, PowerShell'in girişi PowerShell komutları veya ifadeleri olarak yorumlamasını durdurmak için stop-parsing (--%
) belirtecini kullanabilirsiniz.
Not
Ayrıştırma durdurma belirteci yalnızca Windows platformlarında yerel komutları kullanmak için tasarlanmıştır.
Yerel bir komut çağırırken, durdurma ayrıştırma belirtecini program bağımsız değişkenlerinden önce yerleştirin. Bu teknik, yanlış yorumlamayı önlemek için kaçış karakterleri kullanmaktan çok daha kolaydır.
Durdurma ayrıştırma belirteci ile karşılaştığında, PowerShell satırdaki kalan karakterleri değişmez değer olarak ele alır. Yaptığı tek yorum, gibi %USERPROFILE%
standart Windows gösterimini kullanan ortam değişkenlerinin değerlerini değiştirmektir.
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F
PowerShell programa aşağıdaki komut dizesini icacls.exe
gönderir:
X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
Ayrıştırma durdurma belirteci yalnızca sonraki yeni satıra veya işlem hattı karakterine kadar geçerlidir. Efektini genişletmek için satır devamlılığı karakterini (`
) veya etkisini sonlandırmak için bir komut sınırlayıcısı (;
) kullanamazsınız.
Ortam değişkeni başvuruları dışında %variable%
, komutuna başka bir dinamik öğe ekleyemezsiniz. Toplu iş dosyalarının içinde yapabileceğiniz gibi %%
bir %
karakterden kaçış desteklenmez. %<name>%
belirteçler sabit bir şekilde genişletilir. <name>
Tanımlı bir ortam değişkenine başvurmazsa, belirteç olduğu gibi geçirilir.
Akış yeniden yönlendirmesini (gibi >file.txt
) kullanamazsınız çünkü bunlar hedef komuta bağımsız değişken olarak geçirilir.
Aşağıdaki örnekte, ilk adım stop-parsing belirtecini kullanmadan bir komut çalıştırır. PowerShell, tırnak içine alınan dizeyi değerlendirir ve değerini (tırnak işaretleri olmadan) öğesine cmd.exe
geçirir ve hatayla sonuçlanır.
PS> cmd /c echo "a|b"
'b' is not recognized as an internal or external command,
operable program or batch file.
PS> cmd /c --% echo "a|b"
"a|b"
Not
PowerShell cmdlet'leri kullanılırken ayrıştırmayı durdurma belirteci gerekli değildir. Ancak, bağımsız değişkenleri, bu bağımsız değişkenlerle yerel bir komutu çağırmak üzere tasarlanmış bir PowerShell işlevine geçirmek yararlı olabilir.
Tırnak karakterleri içeren bağımsız değişkenleri geçirme
Bazı yerel komutlar, tırnak karakterleri içeren bağımsız değişkenler bekler. PowerShell 7.3, komut satırının yerel komutlar için ayrıştırma şeklini değiştirdi.
Dikkat
Yeni davranış, Windows PowerShell 5.1 davranışındaki hataya neden olan bir değişikliktir . Bu, yerel uygulamaları çağırma sırasında karşılaşılan çeşitli sorunlara geçici çözüm getiren betikleri ve otomasyonu bozabilir. Gerektiğinde yerel bağımsız değişkenin geçmesini önlemek için durdurma ayrıştırma belirtecini Start-Process
(--%
) veya cmdlet'ini kullanın.
$PSNativeCommandArgumentPassing
Yeni tercih değişkeni bu davranışı denetler. Bu değişken çalışma zamanında davranışı seçmenize olanak tanır. Geçerli değerler , Standard
ve Windows
değerleridirLegacy
. Varsayılan davranış platforma özgüdür. Windows platformlarında varsayılan ayardır Windows
ve Windows dışı platformlar varsayılan olarak kullanılır Standard
.
Legacy
tarihi davranıştır. ve Standard
modunun Windows
davranışı aynıdır, Windows
ancak modda aşağıdaki dosyaların çağrıları otomatik olarak stil bağımsız değişkenini Legacy
geçirir.
cmd.exe
cscript.exe
wscript.exe
- ile biten
.bat
- ile biten
.cmd
- ile biten
.js
- ile biten
.vbs
- ile biten
.wsf
$PSNativeCommandArgumentPassing
veya Standard
olarak ayarlanırsaLegacy
, ayrıştırıcı bu dosyaları denetlemez.
Not
Aşağıdaki örneklerde TestExe.exe
aracı kullanılır. Kaynak kodundan oluşturabilirsiniz TestExe
. Bkz . PowerShell kaynak deposunda TestExe .
Bu değişiklikle kullanıma sunulan yeni davranışlar:
Tırnak işaretleri eklenmiş sabit veya genişletilebilir dizeler artık korunur:
PS> $a = 'a" "b' PS> TestExe -echoargs $a 'c" "d' e" "f Arg 0 is <a" "b> Arg 1 is <c" "d> Arg 2 is <e f>
Bağımsız değişken olarak boş dizeler artık korunuyor:
PS> TestExe -echoargs '' a b '' Arg 0 is <> Arg 1 is <a> Arg 2 is <b> Arg 3 is <>
Bu örneklerin amacı, dizin yolunu (boşluklar ve tırnak işaretleri ile) "C:\Program Files (x86)\Microsoft\"
yerel bir komuta geçirerek yolu tırnak içinde bir dize olarak almaktır.
Windows
veya Standard
modunda, aşağıdaki örnekler beklenen sonuçları üretir:
TestExe -echoargs """${env:ProgramFiles(x86)}\Microsoft\"""
TestExe -echoargs '"C:\Program Files (x86)\Microsoft\"'
Aynı sonuçları modda Legacy
almak için tırnak işaretinden çıkmanız veya ayrıştırmayı durdurma belirtecini (--%
):
TestExe -echoargs """""${env:ProgramFiles(x86)}\Microsoft\\"""""
TestExe -echoargs "\""C:\Program Files (x86)\Microsoft\\"""
TestExe -echoargs --% ""\""C:\Program Files (x86)\Microsoft\\"\"""
TestExe -echoargs --% """C:\Program Files (x86)\Microsoft\\""
TestExe -echoargs --% """%ProgramFiles(x86)%\Microsoft\\""
Not
Ters eğik çizgi (\
) karakteri PowerShell tarafından kaçış karakteri olarak tanınmaz. ProcessStartInfo.ArgumentList için temel alınan API tarafından kullanılan kaçış karakteridir.
PowerShell 7.3 ayrıca yerel komutlar için parametre bağlamasını izleme özelliğini de ekledi. Daha fazla bilgi için bkz . Trace-Command.
Bağımsız değişkenleri PowerShell komutlarına geçirme
PowerShell 3.0'dan başlayarak, PowerShell'in girişi PowerShell parametresi olarak yorumlamasını durdurmak için parametre sonu belirtecini (--
) kullanabilirsiniz. Bu, POSIX Kabuğu ve Yardımcı Programlar belirtiminde belirtilen bir kuraldır.
Parametre sonu belirteci
Parametre sonu belirteci (--
), bunu izleyen tüm bağımsız değişkenlerin, çevrelerine çift tırnak yerleştirilmiş gibi gerçek biçimlerinde geçirileceklerini belirtir. Örneğin, kullanarak --
tırnak işareti kullanmadan veya parametre olarak yorumlanmadan dizenin -InputObject
çıkışını alabilirsiniz:
Write-Output -- -InputObject
-InputObject
Stop-parsing (--%
) belirtecinin aksine, belirteci izleyen --
tüm değerler PowerShell tarafından ifade olarak yorumlanabilir.
Write-Output -- -InputObject $env:PROCESSOR_ARCHITECTURE
-InputObject
AMD64
Bu davranış yalnızca PowerShell komutları için geçerlidir. Dış komutu çağırırken belirteci --
kullanırsanız, --
dize bu komuta bağımsız değişken olarak geçirilir.
TestExe -echoargs -a -b -- -c
Çıktı, bağımsız --
değişken TestExe
olarak geçirildiğini gösterir.
Arg 0 is <-a>
Arg 1 is <-b>
Arg 2 is <-->
Arg 3 is <-c>
Tilde (~)
tilde karakterinin (~
) PowerShell'de özel bir anlamı vardır. Bir yolun başında PowerShell komutları ile kullanıldığında, tilde karakteri kullanıcının giriş dizinine genişletilir. Tilde karakteri bir yolun başka herhangi bir yerinde kullanılıyorsa, sabit karakter olarak değerlendirilir.
PS D:\temp> $PWD
Path
----
D:\temp
PS D:\temp> Set-Location ~
PS C:\Users\user2> $PWD
Path
----
C:\Users\user2
Bu örnekte, name parametresi New-Item
bir dize bekler. tilde karakteri değişmez karakter olarak değerlendirilir. Yeni oluşturulan dizine geçmek için yolu tilde karakteriyle nitelemeniz gerekir.
PS D:\temp> Set-Location ~
PS C:\Users\user2> New-Item -Type Directory -Name ~
Directory: C:\Users\user2
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 5/6/2024 2:08 PM ~
PS C:\Users\user2> Set-Location ~
PS C:\Users\user2> Set-Location .\~
PS C:\Users\user2\~> $PWD
Path
----
C:\Users\user2\~
tilde karakterini yerel komutlarla kullandığınızda, PowerShell tilde'yi değişmez değer karakteri olarak geçirir. Bir yolda tilde kullanılması, Windows'ta tilde karakterini desteklemeyen yerel komutlar için hatalara neden olur.
PS D:\temp> $PWD
Path
----
D:\temp
PS D:\temp> Get-Item ~\repocache.clixml
Directory: C:\Users\user2
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 4/29/2024 3:42 PM 88177 repocache.clixml
PS D:\temp> more.com ~\repocache.clixml
Cannot access file D:\temp\~\repocache.clixml
Ayrıca bkz.
PowerShell