PowerShell'de Harici Komut Dosyalarını Genişletme


Her zaman PowerShell ile daha fazlasını yapmanın yollarını arıyorum. Ve çoğu zaman bir teknik bulduğumda onu uygulayabileceğim başka alanlar ararım. Bugünün sizin için de böyle geçmesini umuyorum. Bu makaledeki çalışmamı kopyalamanıza gerek olmayabilir, ancak umarım tekniklerin ve kavramların değerini anlarsınız ve bunları uygulamanın kendi yollarını bulursunuz. İlgilendiğim şey PowerShell sonuçlarını genişletmek ve iyileştirmek.

PowerShell'de farklı türde komutlar vardır. Türlerden biri HariciScript'tir. Bunlar, yolu belirtmeden olmadan çalıştırılabilen PowerShell betik dosyalarıdır.

Get-Command profile.ps1 | 
Select-Object -property Name,Path,@{Name="LastWriteTime";Expression={(Get-Item $_.path).lastWriteTime}},
@{Name="Location";Expression={Split-Path $_.source}}

Boru hattındaki nesneyi takip etmeniz önemlidir. Get-Command, işlem hattına bir System.Management.Automation.ExternalScriptInfo nesnesi yazıyor. Kullanabileceğim bazı özellikleri zaten biliyorum. Ancak yeni özellikleri tanımlamak için de karma tablosu kullanıyorum. LastWriteTime adında bir özellik oluşturuyorum. Değer, Get-Item ile aldığım dosya nesnesinin LastWriteTime değeridir. Ayrıca betiğin ana dizini olacak Konum adlı bir özellik de oluşturuyorum.

Get-Command -CommandType ExternalScript |Select-Object -property Name,Path,
@{Name="LastWriteTime";Expression={(Get-Item $_.path).lastWriteTime}},
@{Name="Location";Expression={Split-Path $_.source}} | 
Sort-Object -Property Location |
Format-Table -GroupBy Location -property Name,LastWriteTime

PowerShell Galerisinden yükleyebileceğiniz PSTypeExtensionToolsmodule'ümdeki bir komutu kullanacağım. Windows PowerShell ve PowerShell 7'de, hatta platformlar arası çalışır. İşte kodum.

$tname = "System.Management.Automation.ExternalScriptInfo"
Add-PSTypeExtension -TypeName $tname -MemberType ScriptProperty -MemberName Location -Value {Split-Path $this.source}
Add-PSTypeExtension -TypeName $tname -MemberType ScriptProperty -MemberName Target -Value {
    $f = Get-Item $this.source
    #Use the target if the file is linked
    if ($f.Target) {
        $f.target
    }
    else {
        #use the full name
        $f.fullname
    }
}
Add-PSTypeExtension -TypeName $tname -MemberType ScriptProperty -MemberName LastWriteTime -Value {
    $f = Get-Item $this.source
    if ($f.Target) {
        (Get-Item -path $f.target).LastWriteTime
    }
    else {
        $f.LastWriteTime
    }
}

Evet, Üye Ekle ile benzer bir şey yapabilirsiniz. Ama şimdi PowerShell komutumun ne kadar kolay olduğunu görün.

Sistemimde sembolik bağlantılara sahip birkaç komut dosyası var, bu yüzden Target özelliğini gösteriyorum.

Bu değişiklikler yalnızca bu PowerShell oturumunda iyidir. Bunları her zaman istiyorsam kodu bir profil komut dosyasına eklemem gerekir. Ancak uzantılarımı bir json dosyasına aktarabildiğim için bunu basitleştirebilirim.

Get-PSTypeExtension -TypeName $tname | Export-PSTypeExtension -Path c:\scripts\externalscriptinfo.json

Daha sonra profilimde bunları getirmek için tek bir kod satırına sahip olabilirim.

Import-PSTypeExtension C:\scripts\externalscriptinfo.json

Ama durun… dahası da var! Harici komut dosyalarını gruplandırılmış bir tablo olarak biçimlendirmek için daha önceki garip komutu hatırlıyor musunuz? Bunu da basitleştirebilirim.
Elinizde yoksa PowerShell Galerisinden PSScriptTools modülünü yükleyin. Daha sonra özel bir biçimlendirme dosyası oluşturmak için New-PSFormatXML komutunu kullanabilirsiniz.

Get-Command mybackuppending.ps1 | New-PSFormatXML -Path c:\scripts\externalscriptinfo.format.ps1xml -Typename $tname -GroupBy Location -Properties Name, Target, LastWriteTime -ViewName location -FormatType table

PowerShell profil betiğimde bu dosyayı içe aktaracağım.

Update-FormatData C:\scripts\externalscriptinfo.format.ps1xml

Bakın bu artık ne kadar kolay.

Umarım bu, hayatınızı ve işinizi kolaylaştırmak için PowerShell'i dönüştürmeniz konusunda size ilham verir. İyi şanlar!

İlgili makaleler