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 bookkomutu 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-Serviceayrış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 ve Get-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 ile Get-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 + -gtdahil 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 $HOMEbasit 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.
  • Tırnak işaretleri (' ve ") başlangıç dizeleri

  • Ayraç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ır

  • Alt ifade işleci ($()) eklenmiş ifadeyi başlatır

  • baş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.
  • 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 (+, -, -eqvb.) 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.exegeç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 , Standardve Windowsdeğ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 Standardolarak 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 TestExeolarak 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.