Umlaut Jerman di Powershell disebut dengan vbs
saya punya file ps1, yang membuat Link
buat-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()
Saya juga memiliki file vbs yang memanggil ps1
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
Kedua file tersebut disimpan dengan encoding utf-8.
Konstruksi ini diperlukan, karena ps1 harus berjalan tanpa kepala sepenuhnya tanpa hal-hal penting bagi pengguna. Memanggil ps1 melalui vbs memecahkan masalah ini, jika ada cara yang lebih baik saya akan senang jika Anda memberi tahu saya.
Jika saya memanggil skrip PowerShell secara langsung atau dengan "powershell.exe Get-Content" "C: \ path \ to \ file \ create-link.ps1" "| PowerShell.exe -noprofile" (dengan menggunakan cmd) semuanya berfungsi dengan baik . Namun, jika saya memanggil vbs untuk melakukan pekerjaan itu bekerja secara umum, tetapi umlaut Jerman dari 'Deskripsi' hanyalah tanda tanya, jadi entah bagaimana pengkodeannya diacak. Apakah ada cara untuk memperbaikinya?
Jawaban
tl; dr:
Simpan
*.ps1
file Anda sebagai UTF-8 dengan BOM .Sederhanakan perintah Anda dengan menggunakan PowerShell CLI 's
-File
parameter:
command = "powershell.exe -NoProfile -File ""C:\path\to\file\create-link.ps1"""
Lihat juga: Masalah GitHub # 3028 , yang meminta kemampuan untuk meluncurkan PowerShell itu sendiri yang benar-benar tersembunyi - meniadakan kebutuhan akan aux. Skrip VBScript - yang mungkin didukung oleh versi masa depan (tetapi tidak akan di-back-port ke Windows PowerShell).
Jika Anda menggunakan Windows PowerShell (versi hingga v5.1), Anda harus menyimpan *.ps1
file Anda sebagai UTF-8 dengan BOM agar dapat ditafsirkan dengan benar sehubungan dengan karakter di luar rentang ASCII (7-bit), seperti äöüß
.
Ini tidak lagi diperlukan di PowerShell [Core] v6 + , yang secara konsisten default ke UTF-8, tetapi jika skrip Anda perlu dijalankan di kedua edisi, Anda harus selalu menggunakan UTF-8 dengan BOM .
Jika yang diberikan *.ps1
tidak memiliki BOM, Windows PowerShell menafsirkan setiap byte yang merupakan bagian dari urutan pengkodean UTF-8 (semua karakter non-ASCII dikodekan sebagai 2-4 byte) secara individual sebagai karakter, berdasarkan ANSI aktif sistem halaman kode (pengkodean byte tunggal seperti Windows-1252).
Pada sistem AS-Inggris, dengan halaman kode ANSI yang aktif adalah Windows-1252, string contoh di atas muncul sebagai string sampah äöüß
Perhatikan bahwa tanda tanya, atau, lebih tepatnya, contoh �
(REPLACEMENT CHARACTER, U+FFFD), hanya akan muncul dalam skenario terbalik : ketika teks berenkode ANSI disalahartikan sebagai UTF-8.
Selain itu, lakukan pendekatan Anda dalam memberikan kode sumber ke PowerShell CLI melalui pipeline (stdin) :
Karena skrip Anda tampaknya tersembunyi, itu tidak akan membuat perbedaan dalam kasus Anda, tetapi perhatikan bahwa teknik ini menunjukkan mode pseudo-interactive dan juga tidak mendukung penerusan argumen ke skrip yang disediakan melalui stdin - lihat GitHub masalah # 3223