Powershell'deki Alman Umlautları vbs tarafından çağrıldı

Dec 15 2020

Bağlantı oluşturan bir ps1 dosyam var

create-link.ps1

$path = $env:HOMESHARE + "\My Projects\"
If(!(test-path $path)) { New-Item -ItemType Directory -Force -Path $path
}

$WshShell = New-Object -comObject WScript.Shell $Shortcut = $WshShell.CreateShortcut($env:HOMESHARE + "\My Projects\" + "linkname.lnk")
$Shortcut.TargetPath = "\\path\for\link" $Shortcut.Description = "äöüß"
$Shortcut.IconLocation = $env:SYSTEMROOT + "\\system32\\shell32.dll,3"
$Shortcut.Save()

Ayrıca ps1'i çağıran bir vbs dosyam var

create-link.vbs

command = "powershell.exe Get-Content ""C:\path\to\file\create-link.ps1"" | PowerShell.exe -noprofile"
set shell = CreateObject("WScript.Shell")
shell.Run command,0

Her iki dosya da utf-8 kodlamasıyla kaydedilir.

Bu yapı gerekliydi, çünkü ps1'in kullanıcı için farkedilebilir herhangi bir şey olmadan tamamen başsız çalışması gerekiyordu. Bir ps1'i bir vbs aracılığıyla aramak bu sorunu çözdü, daha iyi bir yol varsa, bana bildirirseniz mutlu olurum.

Powershell betiğini doğrudan veya "powershell.exe Get-Content" "C: \ path \ to \ file \ create-link.ps1" "| PowerShell.exe -noprofile" (cmd kullanarak) ile çağırıyorsam her şey yolunda gidiyor . Bununla birlikte, işi yapmak için vbs'yi çağırırsam, genel olarak işe yarar, ancak "Açıklama" daki almanca umlautlar sadece soru işaretleridir, bu nedenle kodlama bir şekilde karıştırılır. Bunu düzeltmenin bir yolu var mı?

Yanıtlar

2 mklement0 Dec 15 2020 at 20:59

tl; dr:

  • *.ps1Dosyanızı BOM ile UTF-8 olarak kaydedin .

  • PowerShell kullanarak komutunu kolaylaştırın Cli 'ın -Fileparametresini:

command = "powershell.exe -NoProfile -File ""C:\path\to\file\create-link.ps1"""

Ayrıca bkz: GitHub sorunu # 3028 , PowerShell'in kendisini tamamen gizli olarak başlatma yeteneğini talep ederek bir yardımcıya olan ihtiyacı ortadan kaldırır. VBScript komut dosyası - gelecekteki bir sürümün destekleyebileceği (ancak Windows PowerShell'e geri taşınmayacaktır).


Eğer kullanıyorsanız , Windows PowerShell (v5.1 kadar sürümleri), kendi kaydetmeniz gerekir *.ps1UTF-8 olarak dosyaları bir BOM ile onları ASCII (7 bit) aralığının dışında karakterlere göre doğru yorumlanmalıdır için, sırayla gibi äöüß.
Bu, artık varsayılan olarak UTF-8 olan PowerShell [Core] v6 + 'da gerekli değildir , ancak komut dosyalarınızın her iki sürümde de çalışması gerekiyorsa , BOM ile her zaman UTF-8 kullanmalısınız .

Verilen *.ps1bir ürün reçetesine sahip değilse, Windows PowerShell, UTF-8 kodlama dizisinin parçası olan her baytı (tüm ASCII olmayan karakterler 2-4 bayt olarak kodlanır) ayrı ayrı , sistemin etkin ANSI'sine göre bir karakter olarak yorumlar. kod sayfası (Windows-1252 gibi tek baytlık bir kodlama).

Etkin ANSI kod sayfasının Windows-1252 olduğu bir ABD İngilizcesi sisteminde, yukarıdaki örnek dize bu nedenle çöp dizesi olarak görünür äöüß

Soru işaretlerinin veya daha doğrusu (DEĞİŞTİRME KARAKTERİ U+FFFD) örneklerinin yalnızca ters senaryoda ortaya çıkacağını unutmayın : ANSI kodlu metin UTF-8 olarak yanlış yorumlandığında.


Bir kenara, kaynak kodunu ardışık düzen (stdin) aracılığıyla PowerShell CLI'ye sağlama yaklaşımınız :

Betiğiniz görünüşte gizli çalıştığından, sizin durumunuzda bir fark yaratmayacaktır, ancak bu tekniğin sözde etkileşimli mod sergilediğini ve ayrıca stdin aracılığıyla sağlanan betiğe argümanlar iletmeyi desteklemediğini unutmayın - bkz. GitHub sorunu # 3223