Bölüm 4 - Tek satırlı ve işlem hattı

PowerShell'i ilk kez öğrenmeye başladığımda, PowerShell tek satırlı bir görevi gerçekleştiremiyorsam GUI'ye geri döndüm. Zaman içinde betikler, işlevler ve modüller yazmak için becerilerimi geliştirdim. İnternet'te görebileceğiniz daha gelişmiş örneklerden bazıları kendinizi bunaltmayın. Hiç kimse PowerShell konusunda doğal bir uzman değildir. Hepimiz bir zamanlar yeni başlayanlardık.

Yönetim için GUI kullanmaya devam eden kişilere bir önerim var: yönetim araçlarını yönetici iş istasyonunuza yükleyin ve sunucularınızı uzaktan yönetin. Bu şekilde, sunucunun işletim sisteminin GUI veya Sunucu Çekirdeği yüklemesini çalıştırması önemli değildir. Bu, PowerShell ile sunucuları uzaktan yönetmeye hazırlanmanıza yardımcı olur.

Önceki bölümlerde olduğu gibi, Windows 10 laboratuvar ortamı bilgisayarınızda da bu adımları izlediğinizden emin olun.

Tek Satırlı

PowerShell tek satırlı bir sürekli işlem hattıdır ve tek bir fiziksel satırda bulunan bir komut olması gerekmez. Tek bir fiziksel satırdaki tüm komutlar tek satırlı değildir.

Aşağıdaki komut birden çok fiziksel satırda olsa da, tek bir sürekli işlem hattı olduğundan PowerShell tek satırlı bir komutdur. Tek bir fiziksel satıra yazılabilir ama boru simgesinde çizgi kesmeyi seçtim. Kanal simgesi, PowerShell'de doğal çizgi kesmeye izin verilen karakterlerden biridir.

Get-Service |
  Where-Object CanPauseAndContinue -eq $true |
    Select-Object -Property *
Name                : LanmanWorkstation
RequiredServices    : {NSI, MRxSmb20, Bowser}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Workstation
DependentServices   : {SessionEnv, Netlogon, Browser}
MachineName         : .
ServiceName         : LanmanWorkstation
ServicesDependedOn  : {NSI, MRxSmb20, Bowser}
ServiceHandle       : SafeServiceHandle
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Automatic
Site                :
Container           :

Name                : Netlogon
RequiredServices    : {LanmanWorkstation}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Netlogon
DependentServices   : {}
MachineName         : .
ServiceName         : Netlogon
ServicesDependedOn  : {LanmanWorkstation}
ServiceHandle       : SafeServiceHandle
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Automatic
Site                :
Container           :

Name                : vmicheartbeat
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Heartbeat Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmicheartbeat
ServicesDependedOn  : {}
ServiceHandle       : SafeServiceHandle
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmickvpexchange
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Data Exchange Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmickvpexchange
ServicesDependedOn  : {}
ServiceHandle       : SafeServiceHandle
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmicrdv
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Remote Desktop Virtualization Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmicrdv
ServicesDependedOn  : {}
ServiceHandle       : SafeServiceHandle
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmicshutdown
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Guest Shutdown Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmicshutdown
ServicesDependedOn  : {}
ServiceHandle       : SafeServiceHandle
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmictimesync
RequiredServices    : {VmGid}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Time Synchronization Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmictimesync
ServicesDependedOn  : {VmGid}
ServiceHandle       : SafeServiceHandle
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmicvss
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Volume Shadow Copy Requestor
DependentServices   : {}
MachineName         : .
ServiceName         : vmicvss
ServicesDependedOn  : {}
ServiceHandle       : SafeServiceHandle
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : Winmgmt
RequiredServices    : {RPCSS}
CanPauseAndContinue : True
CanShutdown         : True
CanStop             : True
DisplayName         : Windows Management Instrumentation
DependentServices   : {wscsvc, NcaSvc, iphlpsvc}
MachineName         : .
ServiceName         : Winmgmt
ServicesDependedOn  : {RPCSS}
ServiceHandle       : SafeServiceHandle
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Automatic
Site                :
Container           :

Doğal çizgi sonları virgül () ve açma köşeli ayraçları (,), ayraçlar ([{) ve parantez (() gibi yaygın olarak kullanılan karakterlerde oluşabilir. Bu kadar yaygın olmayan diğer adlar noktalı virgül (; ), eşittir işareti (= ve hem tek hem de çift tırnak (',") işaretidir.

Satır devamı karakteri olarak ters köşe (`) veya vurgu karakterinin kullanılması tartışmalı bir konudur. Önerim mümkünse bundan kaçınmaya çalışmaktır. PowerShell komutlarının genellikle doğal bir satır sonu karakterinin hemen ardından bir backtick kullanılarak yazıldı olduğunu görüyorum. Orada olması için bir sebep yok.

Get-Service -Name w32time |
>> Select-Object -Property *
Name                : w32time
RequiredServices    : {}
CanPauseAndContinue : False
CanShutdown         : True
CanStop             : True
DisplayName         : Windows Time
DependentServices   : {}
MachineName         : .
ServiceName         : w32time
ServicesDependedOn  : {}
ServiceHandle       : SafeServiceHandle
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Önceki iki örnekte gösterilen komutlar PowerShell konsolunda sorunsuz çalışır. Ancak bunları PowerShell ISE'nin konsol bölmesinde çalıştırmayı denerseniz bir hata oluştururlar. PowerShell ISE'nin konsol bölmesi, PowerShell konsolunun yaptığı gibi komutun geri kalanının bir sonraki satıra girilmesi için beklemez. PowerShell ISE'nin konsol bölmesinde bu sorunu önlemek için, başka bir satırda bir komut devam ederken Enter tuşuna basmak yerine Shift+Enter tuşunu kullanın.

Bu sonraki örnek, tek bir sürekli işlem hattı olmadığından PowerShell tek satırlı değildir. Bir satırda noktalı virgülle ayrılmış iki ayrı komut.

$Service = 'w32time'; Get-Service -Name $Service
Status   Name               DisplayName
------   ----               -----------
Running  w32time            Windows Time

Birçok programlama ve betik dili, her satırın sonunda noktalı virgül gerektirir. PowerShell'de bu şekilde kullanılabilseler de, bunlar gerekli olmadığından önerilmez.

Sola Filtreleme

Bu bölümde gösterilen komutların sonuçları bir alt kümeye göre filtrelenmiştir. Örneğin, Get-Service yalnızca Windows Saat hizmetine döndürülen hizmetlerin listesini filtrelemek için Ad parametresiyle birlikte kullanılmıştır.

İşlem hattında sonuçları her zaman en erken aradığınız sonuçlara göre filtrelemek istersiniz. Bu, ilk komut veya en soldaki parametreler kullanılarak gerçekleştirilir. Buna bazen sola filtreleme adı verilir.

Aşağıdaki örnek, sonuçları yalnızca Windows Saat hizmetiyle hemen filtrelemek için name parametresini Get-Service kullanır.

Get-Service -Name w32time
Status   Name               DisplayName
------   ----               -----------
Running  w32time            Windows Time

Filtrelemeyi gerçekleştirmek için komutun yöneltildiği Where-Object örnekleri görmek sık karşılaşılan bir durum değildir.

Get-Service | Where-Object Name -eq w32time
Status   Name               DisplayName
------   ----               -----------
Running  W32Time            Windows Time

İlk örnek kaynakta filtrelenir ve yalnızca Windows Saat hizmeti için sonuçları döndürür. İkinci örnek, filtrelemeyi gerçekleştirmek için tüm hizmetleri döndürür ve sonra bunları başka bir komuta döndürür. Bu örnekte bu büyük bir sorun gibi görünse de, Active Directory kullanıcılarının listesini sorguladıysanız düşünün. Active Directory'den binlerce kullanıcı hesabının bilgilerini yalnızca bunları küçük bir alt kümeye filtreleyen başka bir komuta yöneltmek için mi döndürmek istiyorsunuz? Önerim, önemli görünmese bile her zaman sola filtre uygulamaktır. Bunu o kadar kullanacaksınız ki, gerçekten önemli olduğunda sola otomatik olarak filtreleyeceksiniz.

Bir keresinde birisi bana komutları belirttiğiniz sıranın önemli olmadığını söyletmişti. Bu gerçeklerden daha uzak olamaz. Filtreleme sırasında komutların belirtilmesi gerçekten önemlidir. Örneğin, yalnızca birkaç özellik seçmek ve Where-Object seçimde yer almayacak özelliklere göre filtrelemek için kullandığınız Select-Object senaryoyu göz önünde bulundurun. Bu senaryoda, filtreleme önce gerçekleşmelidir, aksi takdirde filtrelemeyi gerçekleştirmeye çalışıldığında özellik işlem hattında mevcut olmaz.

Get-Service |
Select-Object -Property DisplayName, Running, Status |
Where-Object CanPauseAndContinue

Önceki örnekteki komut hiçbir sonuç döndürmez çünkü canStopAndContinue özelliği sonuçları öğesine Where-Objectyöneltildiğinde Select-Object mevcut değildir. Bu özellik "seçili" değildi. Özünde, filtrelenmişti. ve Where-Object sırasını Select-Object tersine çevirme, istenen sonuçları üretir.

Get-Service |
Where-Object CanPauseAndContinue |
Select-Object -Property DisplayName, Status
DisplayName                                    Status
-----------                                    ------
Workstation                                    Running
Netlogon                                       Running
Hyper-V Heartbeat Service                      Running
Hyper-V Data Exchange Service                  Running
Hyper-V Remote Desktop Virtualization Service  Running
Hyper-V Guest Shutdown Service                 Running
Hyper-V Time Synchronization Service           Running
Hyper-V Volume Shadow Copy Requestor           Running
Windows Management Instrumentation             Running

İşlem Hattı

Bu kitabın tamamında gösterilen örneklerin çoğunda gördüğünüz gibi, bir komutun çıktısı birçok kez başka bir komut için giriş olarak kullanılabilir. Bölüm 3'te, Get-Member bir komutun ürettiği nesne türünü belirlemek için kullanılmıştır. 3. bölüm ayrıca, işlem hattı girişi tarafından kabul edilmese de bu tür girişleri hangi komutların kabul ettiğini belirlemek için parametresininGet-Command kullanıldığı gösterildi.

Komutların ne kadar kapsamlı olduğuna bağlı olarak inputs ve outputs bölümü içerebilir.

help Stop-Service -Full
...
INPUTS
    System.ServiceProcess.ServiceController, System.String
        You can pipe a service object or a string that contains the name of a service
        to this cmdlet.

OUTPUTS
    None, System.ServiceProcess.ServiceController
        This cmdlet generates a System.ServiceProcess.ServiceController object that
        represents the service, if you use the PassThru parameter. Otherwise, this
        cmdlet does not generate any output.
...

Önceki sonuçlarda yalnızca yardımın ilgili bölümü gösterilir. Gördüğünüz gibi INPUTS bölümünde bir ServiceController veya String nesnesinin Stop-Service cmdlet'ine aktarılabildiği belirtiliyor. Hangi parametrelerin bu tür girişi kabul ettiğini göstermez. Bu bilgileri belirlemenin en kolay yollarından biri, cmdlet yardımının Stop-Service tam sürümündeki farklı parametrelere bakmaktır.

help Stop-Service -Full
...
-DisplayName <String[]>
    Specifies the display names of the services to stop. Wildcard characters are
    permitted.

    Required?                    true
    Position?                    named
    Default value                None
    Accept pipeline input?       False
    Accept wildcard characters?  false

-InputObject <ServiceController[]>
    Specifies ServiceController objects that represent the services to stop. 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 of the services to stop. Wildcard characters are
    permitted.

    Required?                    true
    Position?                    0
    Default value                None
    Accept pipeline input?       True (ByPropertyName, ByValue)
    Accept wildcard characters?  false
...

Bir kez daha, önceki sonuç kümesinde yardımın yalnızca ilgili bölümünü gösterdim. DisplayName parametresinin işlem hattı girişini kabul etmediğini, InputObject parametresinin ServiceController nesneleri için değere göre işlem hattı girişini kabul ettiğini ve Name parametresinin dize nesneleri için değere göre işlem hattı girişini kabul ettiğini fark edin. Ayrıca özellik adına göre işlem hattı girişini kabul eder.

Bir parametre hem özellik adına hem de değere göre işlem hattı girişini kabul ettiğinde, her zaman önce değere göre dener. Değere göre başarısız olursa özellik adına göre dener. Değere göre biraz yanıltıcıdır. Ben türüne göre çağırmayı tercih ederim. Başka bir deyişle, ServiceController nesne türü üreten bir komutun sonuçlarını öğesine Stop-Servicegönderirseniz, bu girişi InputObject parametresine bağlar. Ancak dize çıkışı üreten bir komutun sonuçlarını 'a Stop-Serviceaktarırsanız, bunu Name parametresine bağlar. ServiceController veya String nesnesi üretmeyen ancak Name adlı bir özellik içeren bir çıkış üreten bir komutun sonuçlarını döndürürseniz, çıkıştan Name özelliğini name parametresine Stop-Servicebağlar.Stop-Service

Komutun ürettiği çıkış Get-Service türünü belirleyin.

Get-Service -Name w32time | Get-Member
   TypeName: System.ServiceProcess.ServiceController

Get-Service bir ServiceController nesne türü üretir.

Daha önce yardımda gördüğünüz gibi, inputobject parametresi işlem hattı aracılığıyla değere göre (türe göre) ServiceController nesnelerini kabul eder.Stop-Service Bu, cmdlet'in Get-Service sonuçları öğesine Stop-Serviceaktarıldığında, öğesinin InputObject parametresine Stop-Servicebağlandıkları anlamına gelir.

Get-Service -Name w32time | Stop-Service

Şimdi dize girişini deneyin. Get-Member Bunun w32time bir dize olduğunu onaylamak için adresine yöneltin.

'w32time' | Get-Member
   TypeName: System.String

Yardımda daha önce gösterildiği gibi, bir dizeyi Stop-Service kullanarak değerini name parametresine Stop-Servicebağlar. adresine ekleyerek w32time bunu test edin Stop-Service.

'w32time' | Stop-Service

Önceki örnekte dizesinin w32timeçevresinde tek tırnak işareti kullandığıma dikkat edin. PowerShell'de, tırnak içine alınan dizenin içeriği gerçek değerine genişletilmesi gereken bir değişken içermiyorsa, her zaman çift tırnak yerine tek tırnak kullanmanız gerekir. Tek tırnakları kullanarak PowerShell'in tırnak içinde yer alan içeriği ayrıştırması gerekmez, böylece kodunuz biraz daha hızlı çalışır.

name parametresinin Stop-Serviceözellik adına göre işlem hattı girişini test etmek için özel bir nesne oluşturun.

$CustomObject = [pscustomobject]@{
 Name = 'w32time'
 }

CustomObject değişkeninin içeriği bir PSCustomObject nesne türüdür ve Name adlı bir özellik içerir.

$CustomObject | Get-Member
   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Name        NoteProperty string Name=w32time

Değişkeni tırnak içine almak $CustomObject istiyorsanız, çift tırnak kullanmak istersiniz. Aksi takdirde, tek tırnak işareti kullanıldığında değişmez değer $CustomObject değişkeni tarafından kapsanan değer yerine öğesine yönlendirilir Get-Member .

cmdlet'in içeriğinin piping'i Name parametresine bağlansa da, içeriği Name adlı bir özelliğe sahip bir nesne olduğundan$CustomObject, bu kez değeri yerine özellik adına göre bağlanır.$CustomObjectStop-Service

Bu örnekte, Hizmet gibi farklı bir özellik adı kullanarak başka bir özel nesne oluşturuyorum.

$CustomObject = [pscustomobject]@{
  Service = 'w32time'
}

Bir ServiceController veya String nesnesi oluşturmadığından ve Name adlı bir özelliği olmadığından, öğesine bağlanmaya $CustomObjectStop-Service çalışılırken bir hata oluşturulur.

$CustomObject | Stop-Service
Stop-Service : Cannot find any service with service name '@{Service=w32time}'.
At line:1 char:17
+ $CustomObject | Stop-Service
+
    + CategoryInfo          : ObjectNotFound: (@{Service=w32time}:String) [Stop-Service]
   , ServiceCommandException
    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.S
   topServiceCommand

Bir komutun çıktısı başka bir komutun işlem hattı giriş seçenekleriyle hizalanamazsa, Select-Object özelliklerin doğru şekilde sıralanması için özelliği yeniden adlandırmak için kullanılabilir.

$CustomObject |
  Select-Object -Property @{name='Name';expression={$_.Service}} |
    Stop-Service

Bu örnekte, Select-Object Service özelliğini Ad adlı bir özellik olarak yeniden adlandırmak için kullanılmıştır.

Bu örnekteki söz dizimi başlangıçta biraz karmaşık görünebilir. Öğrendiğim şey, kodu kopyalayıp yapıştırarak söz dizimini asla öğrenemeyeceksiniz. Kodu yazmak için zaman ayırın. Birkaç kez sonra, ikinci doğaya dönüşür. Örnek kodu bir ekranda görüntüleyip başka bir ekranda yazabileceğiniz için birden çok monitöre sahip olmak büyük bir avantajdır.

Bazen işlem hattı girişini kabul etmeyen bir parametre kullanmak isteyebilirsiniz. Aşağıdaki örnek, bir komutun çıkışını başka bir komut için giriş olarak kullanmayı gösterir. Önce birkaç Windows hizmeti için görünen adı bir metin dosyasına kaydedin.

'Background Intelligent Transfer Service', 'Windows Time' |
Out-File -FilePath $env:TEMP\services.txt

Girişi gerektiren komutun parametresinin değeri olarak parantez içinde gerekli çıkışı sağlayan komutu çalıştırabilirsiniz.

Stop-Service -DisplayName (Get-Content -Path $env:TEMP\services.txt)

Bu tıpkı Cebir'deki operasyon düzeni gibi nasıl çalıştığını hatırlayanlar için. Parantez içindeki komut her zaman komutun dış kısmından önce çalışır.

PowerShellGet

PowerShellGet, NuGet deposundan PowerShell modüllerini (ve diğer yapıtları) bulma, yükleme, yayımlama ve güncelleştirme komutlarını içeren bir PowerShell modülüdür. PowerShellGet, PowerShell sürüm 5.0 ve üzeri ile birlikte gösterilir. PowerShell sürüm 3.0 ve üzeri için ayrı bir indirme olarak kullanılabilir.

Microsoft, PowerShell Galerisi adlı çevrimiçi bir NuGet deposunu barındırır. Bu depo Microsoft tarafından barındırılıyor olsa da, depoda yer alan modüllerin çoğu Microsoft tarafından yazılamaz. PowerShell Galerisi elde edilen tüm kodlar, üretim ortamında kullanıma uygun olarak kabul edilmeden önce yalıtılmış bir test ortamında ayrıntılı bir şekilde gözden geçirilmelidir.

Çoğu şirket kendi iç özel NuGet deposunu barındırmak isteyecektir; burada yalnızca iç kullanım modüllerini ve diğer kaynaklardan indirdikleri modülleri kötü amaçlı olmadığını doğruladıktan sonra gönderebileceklerdir.

Find-Module PowerShell Galerisi MrToolkit adlı bir modül bulmak için PowerShellGet modülünün parçası olan cmdlet'ini kullanın.

Find-Module -Name MrToolkit
NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with
NuGet-based repositories. The NuGet provider must be available in 'C:\Program
Files\PackageManagement\ProviderAssemblies' or
'C:\Users\MrAdmin\AppData\Local\PackageManagement\ProviderAssemblies'. You can also
install the NuGet provider by running 'Install-PackageProvider -Name NuGet
-MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to install and import the
NuGet provider now?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"):

Version    Name                                Repository           Description
-------    ----                                ----------           -----------
1.1        MrToolkit                           PSGallery            Misc PowerShell Tools

PowerShellGet modülündeki komutlardan birini ilk kez kullandığınızda NuGet sağlayıcısını yüklemeniz istenir.

MrToolkit modülünü yüklemek için, önceki komutu öğesine aktarın Install-Module.

Find-Module -Name MrToolkit | Install-Module
Untrusted repository
You are installing the modules from an untrusted repository. If you trust this
repository, change its InstallationPolicy value by running the Set-PSRepository cmdlet.
Are you sure you want to install the modules from
'https://www.powershellgallery.com/api/v2/'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): y

PowerShell Galerisi güvenilmeyen bir depo olduğundan modülün yüklenmesini onaylamanızı ister.

İşlem hattı girişini kolay bir şekilde bulma

MrToolkit modülü adlı Get-MrPipelineInputbir işlev içerir. Bu cmdlet, bir komutun hangi parametrelerinin işlem hattı girişini kabul ettiği, hangi nesne türünü kabul ettikleri ve işlem hattı girişini değere veya özellik adına göre kabul edip etmediklerini kolayca belirlemek için kullanılabilir.

Get-MrPipelineInput -Name Stop-Service
ParameterName ParameterType                             ValueFromPipeline ValueFromPipelineByPropertyName
------------- -------------                             ----------------- ---------------
InputObject   System.ServiceProcess.ServiceController[]              True           False
Name          System.String[]                                        True            True

Gördüğünüz gibi, daha önce yardım aracılığıyla eleyerek belirlediğimiz bilgiler bu işlevle kolayca belirlenebilir.

Özet

Bu bölümde, PowerShell tek satırlı öğeleri hakkında bilgi edindiniz. Bir komutun üzerinde olduğu fiziksel satır sayısının PowerShell tek satırlı olup olmamasıyla hiçbir ilgisi olmadığını öğrendinsiniz. Ayrıca sola, işlem hattına ve PowerShellGet'e filtreleme hakkında da bilgi edindiniz.

İnceleyin

  1. PowerShell tek satırlı nedir?
  2. PowerShell'de doğal satır sonlarının oluşabileceği karakterlerden bazıları nelerdir?
  3. Neden sola filtre uygulamalısınız?
  4. PowerShell komutunun işlem hattı girişini kabul etmenin iki yolu nelerdir?
  5. PowerShell Galerisi bulunan komutlara neden güvenmemelisiniz?