Cuma Eğlencesi: PowerShell Konsol Düzenleme
Geçen gün Adam Bertram'ın blogunda PowerShell'de bir metin düzenleyiciyle dosyaları düzenlemeyle ilgili ilginç bir makale okudum. Doğal olarak kafamdaki PowerShell çarkları dönmeye başladı. Makaledeki bazı seçenekler ilgimi çekse de, aslında oynamak için Mikro düzenleyiciyi yükledim, en sevdiğim konsol metin düzenleyicimin zaten yüklü olduğunu fark ettim. Makalede Windows için Nano düzenleyicinin kurulumundan bahsediliyordu. Ama Ubuntu'nun WSL kurulumum var. Nano editörüm zaten var. Adil olmak gerekirse Windows için Nano'yu yükledim ama Linux sürümünden beni rahatsız edecek kadar farklı. PowerShell konsolumda zaten sahip olduğum özelliklerin kullanımını neden kolaylaştırmıyorsunuz? Biraz eğlenelim ve belki yeni bir şeyler öğrenelim.
WSL Komutları
Yüklü bir Linux dağıtımınız varsa PowerShell isteminizden yerel Linux komutlarını çalıştırabilirsiniz.
Genellikle bu komutlar bir Linux kabuğunda çalışıyor ancak çıktıyı PowerShell konsolumda alıyorum. Ne olursa olsun, nano düzenleyiciyi doğrudan PowerShell komut isteminden kolayca başlatabilirim.
wsl nanoYolları Dönüştürme
Ama işin zorlaştığı yer burası. Nano düzenleyiciyi başlatabilmek ve Windows'tan bir metin dosyası açabilmek istiyorum. Linux'ta şöyle bir komut çalıştırabilirim:
nano /home/jeff/file.txt
PowerShell istemimden buna benzer bir şey denersem:
wsl nano c:\work\fun.ps1Nano düzenleyici açılacak ancak yeni bir dosya oluşturduğumu sanıyor. Bunun nedeni, nano'nun benim PowerShell istemimde değil, gerçekten Ubuntu dağıtımında çalışıyor olmasıdır. Şans eseri tüm yerel sürücülerim otomatik olarak WSL'ye bağlanıyor. Eğer yolu kafamda dönüştürürsem bu işe yarayacaktır.
wsl nano /mnt/c/work/fun.ps1Elbette işlerin basit ve kolay olmasını istiyorum, bu nedenle bir Windows yolunu WSL'nin bağlı yoluna dönüştürecek bir işleve ihtiyacım olacak. Öncelikle Windows yolunu gerçek bir dosya sistemi yoluna dönüştürmeliyim. Bu, .\file.txt gibi yolları veya S:\remote.ps1 gibi bir PSDrive kullandığım yerleri dönüştürmeye yardımcı olacaktır.
$cPath = Convert-Path -Path $PathDaha sonra bu dönüştürülmüş yolu ana dizine ve dosya adına böleceğim.
$file = Split-Path -Path $cpath -Leaf
$dir = Split-Path -Path $cPath -ParentDaha sonra, ana dizinin yol kısmının sürücü harfi olmadan olmasını istiyorum.
$folder = $dir.Substring(3)Bunların hepsini yapıyorum çünkü Linux'ta ilgili yolu bağlama noktasını kullanarak oluşturmam gerekiyor.
"/mnt/{0}/{1}/{2}" -f $dir[0].tostring().ToLower(), $folder.replace("\", "/"), $fileAna dizinin ilk harfini kullanarak yeni bir dize oluşturuyorum. Linux büyük/küçük harfe duyarlı olduğundan, Linux'taki yolla eşleşmesi için onu küçük harfe dönüştürüyorum. Yapmam gereken diğer düzenleme tüm \'leri /'ye geçirmek.
Artık nano komutu beklendiği gibi çalışıyor.
Araç Seti Oluşturma
Elbette, mevcut bir dosyayı düzenlemek mi yoksa yeni bir şey oluşturmak mı istediğimi hesaba katarak nano'yu başlatmak için bir PowerShell işlevi de geliştirdim.
[string]$cmd = "wsl --exec nano"
if ($Path) {
$wslPath = ConvertTo-WSLPath -Path $Path
$cmd += " $wslPath"
}
#convert to a scriptblock
$sb = [scriptblock]::Create($cmd)
Invoke-Command -ScriptBlock $sbBu, fonksiyonun özüdür.
Eklediğim son parçalar doğrulamayla ilgiliydi. ConvertTo-WSLPath ve Invoke-Nano işlevlerim, kaynağı noktalamam gereken bir .ps1 dosyasındadır. Ancak WSL kurulumu yoksa komutlar kullanılamaz
$WslTest = ((wsl -l).split()).where({$_.length -gt 1}) -contains "(Default)"
If ( -Not $WslTest) {
Write-Warning "These commands require a WSL installation"
Return
}Bunu çözmek, hayal ettiğimden çok daha fazla çaba gerektirdi. Kurulu kurulumları görmek için wsl -l komutunu çalıştırabilirsiniz. Ancak çıktının kodlaması mutlaka konsolda gördüğünüz gibi olmayabilir. -Match veya Select-String kullanma çabalarım başarısız olmaya devam etti. Sonunda, wsl komutunun sonuçlarını uzunluğu 1'den büyük bir dize dizisine bölmek için bu kodu buldum. Sonra '(Varsayılan)'ı aramak için -Contains'ı kullanabilirim. Dize bulunamazsa bir uyarı görüntüleyip komut dosyasından çıkacağım.
Ayrıca betiği nokta kaynak olarak kullanan kişinin Windows'ta (PowerShell 7 veya Windows PowerShell) çalıştığını doğrulamak istedim. İşlevlerim bir If ifadesinin içinde tanımlıdır.
if ($IsWindows -OR ($PSEdition -eq 'desktop')) {
#define functions
}
Else {
Write-Warning "These commands require a Windows platform"
}PowerShell konsolunda başka bir şey varsa başka bir uyarı görüntülenir. Nihai sonucu görmek ister misiniz?
# requires -version 5.1
#launch the nono text editor from a WSL installation like Ubuntu
# or install the Windows version https://sourceforge.net/projects/nano-for-windows/
# or https://sourceforge.net/projects/micro-for-windows/
# https://micro-editor.github.io/
if ($IsWindows -OR ($PSEdition -eq 'desktop')) {
#test if there is a default WSL installation
$WslTest = ((wsl -l).split()).where({$_.length -gt 1}) -contains "(Default)"
If ( -Not $WslTest) {
Write-Warning "These commands require a WSL installation"
Return
}
# a helper function to convert a Windows path to the WSL equivalent
Function ConvertTo-WSLPath {
[cmdletbinding()]
[outputtype("String")]
Param(
[Parameter(Position = 0, Mandatory, HelpMessage = "Enter a Windows file system path")]
[ValidateNotNullorEmpty()]
[string]$Path
)
Write-Verbose "[$($myinvocation.mycommand)] Starting $($myinvocation.mycommand)"
Write-Verbose "[$($myinvocation.mycommand)] Converting $Path to a filesystem path"
$cPath = Convert-Path -Path $Path
Write-Verbose "[$($myinvocation.mycommand)] Converted to $cpath"
$file = Split-Path -Path $cpath -Leaf
$dir = Split-Path -Path $cPath -Parent
$folder = $dir.Substring(3)
"/mnt/{0}/{1}/{2}" -f $dir[0].tostring().ToLower(), $folder.replace("\", "/"), $file
Write-Verbose "[$($myinvocation.mycommand)] Ending $($myinvocation.mycommand)"
}
#launch the nano editor from the WSL installation
Function Invoke-Nano {
[CmdletBinding()]
[outputtype("none")]
[alias("nano")]
Param(
[Parameter(Position = 0, HelpMessage = "Specify a text file path.")]
[ValidatenotNullorEmpty()]
[ValidateScript({ Test-Path $_ })]
[string]$Path
)
Write-Verbose "[$($myinvocation.mycommand)] Starting $($myinvocation.mycommand)"
[string]$cmd = "wsl --exec nano"
if ($Path) {
Write-Verbose "[$($myinvocation.mycommand)] Convert $Path"
$wslPath = ConvertTo-WSLPath -Path $Path
$cmd += " $wslPath"
}
Write-Verbose "[$($myinvocation.mycommand)] Using command expression $cmd"
#convert to a scriptblock
$sb = [scriptblock]::Create($cmd)
Write-Verbose "[$($myinvocation.mycommand)] Launch nano from the WSL installation"
Invoke-Command -ScriptBlock $sb
Write-Verbose "[$($myinvocation.mycommand)] Ending $($myinvocation.mycommand)"
}
}
Else {
Write-Warning "These commands require a Windows platform"
}Verbose ifadelerimle denediğim yeni bir şeye dikkat çekmek istiyorum. Sık sık başka işlevleri çağıran işlevlerim var. Her ayrıntılı ifadeye komut adını ekliyorum. Bu akışı takip etmeyi kolaylaştırır.
Artık dosyaları doğrudan PowerShell konsolundan hızlı bir şekilde düzenleyebiliyorum.
Ve hayır, bu, VS Code veya PowerShell ISE kullanarak elde edeceğim işlevselliğin yerini almaz. Ancak bazen sadece hızlı bir düzenleme yapmak veya kaynak kodunu görüntülemek istiyorum. Nano düzenleyiciye taraftarım, ancak bu kavramları vim'i veya WSL kurulumunuza yüklediğiniz herhangi bir metin düzenleyiciyi başlatmak için kullanabilirsiniz.
İyi eğlenceler.




