about_Pipelines
Kısa açıklama
Komutları PowerShell'de işlem hatlarıyla birleştirme
Uzun açıklama
İşlem hattı, işlem hattı işleçleri ( | ) (ASCII 124) tarafından bağlanan bir dizi komuttır. Her işlem hattı işleci önceki komutun sonuçlarını bir sonraki komuta gönderir.
İlk komutun çıktısı, ikinci komuta giriş olarak iş için gönderebilirsiniz. Bu çıkış da başka bir komuta gönderebilirsiniz. Sonuç, bir dizi basit komutdan oluşan karmaşık bir komut zinciri veya işlem hattıdır.
Örneğin,
Command-1 | Command-2 | Command-3
Bu örnekte, Command-1 yayın nesneler'e Command-2 gönderilir.
Command-2 nesneleri işler ve 'ye Command-3 gönderir. Command-3 nesneleri işler ve işlem hattına gönderir. İşlem hattında başka komut yoktur, çünkü sonuçlar konsolunda görüntülenir.
İşlem hattında komutlar soldan sağa doğru sırayla işlenir. İşleme tek bir işlem olarak işlendi ve çıktı oluşturulurken görüntülenir.
İşte basit bir örnek. Aşağıdaki komut, Not Defteri işlemini alır ve durdurur.
Örneğin,
Get-Process notepad | Stop-Process
İlk komut, Get-Process cmdlet'ini kullanarak bu işlemi temsil eden Not Defteri olur. İşlem nesnesini | cmdlet'e göndermek için bir işlem hattı işleci ( ) kullanır ve bu işlem Not Defteri Stop-Process durdurur. Belirtilen işlem işlem hattı üzerinden gönderiliyor olduğundan, komutun işlemi belirtmek için bir Name veya Stop-Process ID parametresine sahip olmadığını farkedin.
Bu işlem hattı örneği geçerli dizinde yer alan metin dosyalarını alır, yalnızca 10.000 bayt'ın üzerinde olan dosyaları seçer, bunları uzunlulara göre sıralar ve her dosyanın adını ve uzunluğunu bir tabloda görüntüler.
Get-ChildItem -Path *.txt |
Where-Object {$_.length -gt 10000} |
Sort-Object -Property length |
Format-Table -Property name, length
Bu işlem hattı belirtilen sırada dört komut içerir. Aşağıdaki çizimde, işlem hattında bir sonraki komuta geçirilen her komutun çıkışı gösterilmiştir.
Get-ChildItem -Path *.txt
| (FileInfo objects for *.txt)
V
Where-Object {$_.length -gt 10000}
| (FileInfo objects for *.txt)
| ( Length > 10000 )
V
Sort-Object -Property Length
| (FileInfo objects for *.txt)
| ( Length > 10000 )
| ( Sorted by length )
V
Format-Table -Property name, length
| (FileInfo objects for *.txt)
| ( Length > 10000 )
| ( Sorted by length )
| ( Formatted in a table )
V
Name Length
---- ------
tmp1.txt 82920
tmp2.txt 114000
tmp3.txt 114000
İşlem hatlarını kullanma
Çoğu PowerShell cmdlet'i işlem hatlarını destekleyecek şekilde tasarlanmıştır. Çoğu durumda, Get cmdlet'inin sonuçlarını aynı ada sahip başka bir cmdlet'e kanala kanala yöneltin.
Örneğin, cmdlet'in çıkışını veya Get-Service Start-Service Stop-Service cmdlet'lere yöneltin.
Bu örnek işlem hattı, wmi hizmetini bilgisayarda başlatır:
Get-Service wmi | Start-Service
Başka bir örnek için, PowerShell kayıt defteri sağlayıcısı Get-Item içindeki veya Get-ChildItem çıkışını New-ItemProperty cmdlet'ine kanala alabilirsiniz. Bu örnek, MyCompany kayıt defteri anahtarına 8124 değeriyle NoOfEmployees yeni bir kayıt defteri girdisi ekler.
Get-Item -Path HKLM:\Software\MyCompany |
New-ItemProperty -Name NoOfEmployees -Value 8124
, , , ve gibi yardımcı program cmdlet'lerinin çoğu neredeyse Get-Member Where-Object yalnızca işlem Sort-Object Group-Object Measure-Object hatlarında kullanılır. Herhangi bir nesne türünü bu cmdlet'lere yöneltebilirsiniz. Bu örnekte, bilgisayarda tüm işlemlerin her bir işlemde açık tanıtıcı sayısına göre nasıl sıralan açık olduğu gösterir.
Get-Process | Sort-Object -Property handles
Nesneleri , , , ve gibi biçimlendirme, dışarı aktarma ve çıkış cmdlet'leri Format-List Format-Table ile Export-Clixml Export-CSV kanala Out-File aktarabilirsiniz.
Bu örnekte, bir işlem nesnesinin Format-List özelliklerinin listesini görüntülemek için cmdlet'in nasıl kullanımı gösterilir.
Get-Process winlogon | Format-List -Property *
Ayrıca, yerel komutların çıkışını PowerShell cmdlet'leri ile de kanala yapabilirsiniz. Örnek:
PS> ipconfig.exe | Select-String -Pattern 'IPv4'
IPv4 Address. . . . . . . . . . . : 172.24.80.1
IPv4 Address. . . . . . . . . . . : 192.168.1.45
IPv4 Address. . . . . . . . . . . : 100.64.108.37
Önemli
Başarılı ve Hata akışları, diğer kabukların stdin ve stderr akışlarına benzer. Ancak stdin, giriş için PowerShell işlem hattına bağlı değildir. Daha fazla bilgi için bkz. about_Redirection.
Biraz alıştırmayla, basit komutların işlem hatlarında birleştirerek zamandan ve yazmadan tasarruf edin ve betik yazmanızı daha verimli hale getirir.
İşlem hatları nasıl çalışır?
Bu bölümde, giriş nesnelerinin cmdlet parametrelerine nasıl bağlanarak işlem hattı yürütme sırasında işlenmeleri açıklanır.
İşlem hattı girişini kabul eder
Ardışık düzeni desteklemek için, alıcı cmdlet'in işlem hattı girişini kabul eden bir parametresi olmalıdır. Bir Get-Help cmdlet'in hangi parametrelerin işlem hattı girişini kabul etdiğini belirlemek için Tam veya Parametre seçenekleriyle komutunu kullanın.
Örneğin, cmdlet'in hangi parametrelerinin işlem Start-Service hattı girişini kabul eder olduğunu belirlemek için, yazın:
Get-Help Start-Service -Full
veya
Get-Help Start-Service -Parameter *
Start-Servicecmdlet'inin yardımı yalnızca InputObject ve Name parametrelerinin işlem hattı girişini kabul etmelerini gösterir.
-InputObject <ServiceController[]>
Specifies ServiceController objects representing the services to be started.
Enter a variable that contains the objects, or type a command or expression
that gets the objects.
Required? true
Position? 0
Default value None
Accept pipeline input? True (ByValue)
Accept wildcard characters? false
-Name <String[]>
Specifies the service names for the service to be started.
The parameter name is optional. You can use Name or its alias, ServiceName,
or you can omit the parameter name.
Required? true
Position? 0
Default value None
Accept pipeline input? True (ByPropertyName, ByValue)
Accept wildcard characters? false
İşlem hattı üzerinden 'a nesne göndererek Start-Service PowerShell, nesneleri InputObject ve Name parametreleriyle ilişkilendirmeyi dener.
İşlem hattı girişini kabul etme yöntemleri
Cmdlet parametreleri, işlem hattı girişini iki farklı şekilde kabul eder:
ByValue: parametresi, beklenen .NET türüyle eşan veya bu türe dönüştürülen değerleri kabul eder.
Örneğin Name parametresi, işlem hattı
Start-Servicegirişini değere göre kabul eder. Dizelere dönüştürülecek dize nesnelerini veya nesneleri kabul eder.ByPropertyName: parametresi yalnızca giriş nesnesinin parametresiyle aynı adlı bir özelliği olduğunda girişi kabul eder.
Örneğin Name parametresi, Name
Start-Serviceözelliğine sahip nesneleri kabul eder. Bir nesnenin özelliklerini listeleyebilirsiniz.Get-Member
Bazı parametreler hem değer hem de özellik adına göre nesneleri kabul eder, bu da işlem hattından giriş almalarını kolaylaştırır.
Parametre bağlama
Nesneleri bir komuttan başka bir komuta yöneltirken PowerShell, kanala alınan nesneleri alan cmdlet'in parametresiyle ilişkilendirmeye çalışır.
PowerShell'in parametre bağlama bileşeni, giriş nesnelerini aşağıdaki ölçütlere göre cmdlet parametreleriyle ilişkilendirmektedir:
- parametresi, bir işlem hattından gelen girişi kabul etmeli.
- parametresi, gönderilen nesne türünü veya beklenen türe dönüştürülecek bir türü kabul etmek gerekir.
- parametresi komutunda kullanılmadı.
Örneğin, Start-Service cmdlet'in birçok parametresi vardır, ancak name ve InputObject işlem hattı girişini kabul eder. Name parametresi dizeleri, InputObject parametresi ise hizmet nesnelerini alır. Bu nedenle dizeleri, hizmet nesnelerini ve nesneleri dize veya hizmet nesnelerine dönüştürülecek özelliklerle kanala edebilirsiniz.
PowerShell, parametre bağlamayı mümkün olduğunca verimli bir şekilde yönetir. PowerShell'i belirli bir parametreye bağlamayı önerecek veya zorlayabilirsiniz. PowerShell, kanala bağlı nesneleri bağlayamazsa komut başarısız olur.
Bağlama hatalarını giderme hakkında daha fazla bilgi için bu makalenin devamlarında yer alan İşlem Hattı Hatalarını Araştırma makalesine bakın.
Tek tek işleme
Nesneleri bir komuta göndermek, nesneleri göndermek için komutunun parametresini kullanmaya çok benzer. Şimdi bir işlem hattı örneğine bakalım. Bu örnekte, hizmet nesnelerinin bir tabloyu görüntülemek için bir işlem hattı kullanıyoruz.
Get-Service | Format-Table -Property Name, DependentServices
İşlevsel olarak, bu nesne koleksiyonunu göndermek için InputObject Format-Table parametresini kullanmaya benzer.
Örneğin, hizmet koleksiyonunu InputObject parametresi kullanılarak geçirilen bir değişkene kaydedebiliriz.
$services = Get-Service
Format-Table -InputObject $services -Property Name, DependentServices
Veya komutunu InputObject parametresine eklememiz de gerekir.
Format-Table -InputObject (Get-Service) -Property Name, DependentServices
Ancak önemli bir fark vardır. Bir komuta birden çok nesne yöneltme, PowerShell nesneleri tek tek komuta gönderir. Bir komut parametresini kullanırken, nesneler tek bir dizi nesnesi olarak gönderilir. Bu küçük farkın önemli sonuçları vardır.
İşlem hattı yürütilirken PowerShell, arabirimi uygulayan ve üyeleri işlem hattı üzerinden tek tek gönderen her türü IEnumerable otomatik olarak numaralar. yöntemine [hashtable] çağrı gerektiren özel GetEnumerator() durumdur.
Aşağıdaki örneklerde, işlem hattından alınan nesne sayısını saymak için bir dizi ve karma tablosu Measure-Object cmdlet'ine aktarıldı. Dizi birden çok üyeye sahip ve karma tablosu birden çok anahtar-değer çifti vardır. Aynı anda yalnızca bir dizi numaralandı.
@(1,2,3) | Measure-Object
Count : 3
Average :
Sum :
Maximum :
Minimum :
Property :
@{"One"=1;"Two"=2} | Measure-Object
Count : 1
Average :
Sum :
Maximum :
Minimum :
Property :
Benzer şekilde, Get-Process cmdlet'inden cmdlet'ine birden çok işlem nesnesi gönderirsiniz, PowerShell her işlem nesnesini tek tek Get-Member 'e Get-Member gönderir. Get-Member , işlem nesnelerinin .NET sınıfını (türü) ve bunların özelliklerini ve yöntemlerini görüntüler.
Get-Process | Get-Member
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize
...
Not
Get-Member yinelenenleri ortadan kaldırıyor, bu nedenle nesnelerin hepsi aynı türde ise yalnızca bir nesne türü görüntüler.
Ancak, InputObject parametresini kullanırsanız, Get-Member Get-Member System.Diagnostics.Process nesnelerinin dizisini tek bir birim olarak alır. Bir nesne dizisinin özelliklerini görüntüler. (System.Object tür adının [] ardından gelen dizi sembolünü ( ) not eder.)
Örneğin,
Get-Member -InputObject (Get-Process)
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
Address Method System.Object& Address(Int32 )
Clone Method System.Object Clone()
...
Bu sonuç, amaçlanan sonuç olabilir. Ancak anladikten sonra kullanabilirsiniz. Örneğin, tüm dizi nesneleri bir Count özelliğine sahiptir. Bilgisayarda çalışan işlemlerin sayısını saymak için bunu kullanabilirsiniz.
Örneğin,
(Get-Process).count
İşlem hattına gönderilen nesnelerin tek tek teslim edildiklerini unutmamanız önemlidir.
İşlem hattı hatalarını araştırma
PowerShell, kanala alınan nesneleri alan cmdlet'in parametresiyle ilişkilendirilemezse komut başarısız olur.
Aşağıdaki örnekte, bir kayıt defteri girdisini bir kayıt defteri anahtarından diğerine taşımaya çalışmamız gerekir. Get-ItemCmdlet, daha sonra cmdlet'e giden hedef Move-ItemProperty yolu alır. komutu, Move-ItemProperty taşın eklenecek kayıt defteri girişinin geçerli yolunu ve adını belirtir.
Get-Item -Path HKLM:\Software\MyCompany\sales |
Move-ItemProperty -Path HKLM:\Software\MyCompany\design -Name product
Komut başarısız olur ve PowerShell aşağıdaki hata iletisini görüntüler:
Move-ItemProperty : The input object can't be bound to any parameters for
the command either because the command doesn't take pipeline input or the
input and its properties do not match any of the parameters that take
pipeline input.
At line:1 char:23
+ $a | Move-ItemProperty <<<< -Path HKLM:\Software\MyCompany\design -Name p
Araştırmak için Trace-Command cmdlet'ini kullanarak PowerShell'in parametre bağlama bileşenini izleme. Aşağıdaki örnek, işlem hattı yürütken parametre bağlamayı izler. PSHost parametresi izleme sonuçlarını konsolunda görüntüler ve FilePath parametresi izleme sonuçlarını daha sonra başvuru için debug.txt dosyaya gönderir.
Trace-Command -Name ParameterBinding -PSHost -FilePath debug.txt -Expression {
Get-Item -Path HKLM:\Software\MyCompany\sales |
Move-ItemProperty -Path HKLM:\Software\MyCompany\design -Name product
}
İzlemenin sonuçları uzun olur, ancak cmdlet'e bağlı olan değerleri ve Get-Item ardından cmdlet'e bağlı olan Move-ItemProperty adlandırılmış değerleri gösterir.
...
BIND NAMED cmd line args [`Move-ItemProperty`]
BIND arg [HKLM:\Software\MyCompany\design] to parameter [Path]
...
BIND arg [product] to parameter [Name]
...
BIND POSITIONAL cmd line args [`Move-ItemProperty`]
...
Son olarak yolu Hedef parametresine bağlama girişiminin başarısız olduğunu Move-ItemProperty gösterir.
...
BIND PIPELINE object to parameters: [`Move-ItemProperty`]
PIPELINE object TYPE = [Microsoft.Win32.RegistryKey]
RESTORING pipeline parameter's original values
Parameter [Destination] PIPELINE INPUT ValueFromPipelineByPropertyName NO
COERCION
Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName NO
COERCION
...
Destination Get-Help parametresinin özniteliklerini görüntülemek için cmdlet'ini kullanın.
Get-Help Move-ItemProperty -Parameter Destination
-Destination <String>
Specifies the path to the destination location.
Required? true
Position? 1
Default value None
Accept pipeline input? True (ByPropertyName)
Accept wildcard characters? false
Sonuçlar, Destination'ın işlem hattı girişini yalnızca "özellik adına göre" alır olduğunu gösterir. Bu nedenle, kanala sahip nesnenin Destination adlı bir özelliği olması gerekir.
'den Get-Member gelen nesnenin özelliklerini görmek için Get-Item kullanın.
Get-Item -Path HKLM:\Software\MyCompany\sales | Get-Member
Çıktı, öğenin Destination özelliği olmayan bir Microsoft.Win32.RegistryKey nesnesi olduğunu gösterir. Bu, komutun neden başarısız olduğunu açıklar.
Path parametresi, ad veya değere göre işlem hattı girişini kabul eder.
Get-Help Move-ItemProperty -Parameter Path
-Path <String[]>
Specifies the path to the current location of the property. Wildcard
characters are permitted.
Required? true
Position? 0
Default value None
Accept pipeline input? True (ByPropertyName, ByValue)
Accept wildcard characters? true
Komutu düzeltmek için cmdlet'inde hedefi belirtmeli ve taşımak istediğiniz öğenin Move-ItemProperty Get-Item Yolunu almak için kullanacağız.
Örneğin,
Get-Item -Path HKLM:\Software\MyCompany\design |
Move-ItemProperty -Destination HKLM:\Software\MyCompany\sales -Name product
Iç satır devamlılığı
Daha önce de tartıştığımız gibi, işlem hattı işleçleri () tarafından bağlanan ve genellikle tek bir satıra yazılan | bir dizi komut işlem hattıdır. Ancak, okunabilirlik için PowerShell işlem hattını birden çok satıra bölmeye olanak sağlar.
Bir kanal işleci satırdaki son belirteç olduğunda PowerShell ayrıştırıcısı, işlem hattının yapısına devam etmek için bir sonraki satırı geçerli komutla bir araya alır.
Örneğin, aşağıdaki tek satırlı işlem hattı:
Command-1 | Command-2 | Command-3
şu şekilde yaz olabilir:
Command-1 |
Command-2 |
Command-3
Sonraki satırlarda baştaki boşluklar önemli değildir. Girintileme okunabilirliği artırır.
PowerShell 7, bir satırın başında işlem hattı karakteriyle işlem hatlarının devamlılığı için destek ekler. Aşağıdaki örnekler, bu yeni işlevi nasıl kullanabileceğiniz gösterir.
# Wrapping with a pipe at the beginning of a line (no backtick required)
Get-Process | Where-Object CPU | Where-Object Path
| Get-Item | Where-Object FullName -match "AppData"
| Sort-Object FullName -Unique
# Wrapping with a pipe on a line by itself
Get-Process | Where-Object CPU | Where-Object Path
|
Get-Item | Where-Object FullName -match "AppData"
|
Sort-Object FullName -Unique
Önemli
Kabukta etkileşimli olarak çalışırken, kodu yalnızca yapıştırmak için CtrlV kullanırken satırın başına işlem + hatlarıyla yapıştırabilirsiniz. Yapıştırma işlemlerine sağ tıklayıp satırları tek tek ekler. Satır bir işlem hattı karakteriyle bitmaya, PowerShell girişin tamamlanacak şekilde kabul eder ve girilen şekilde bu satırı yürütür.