Umlauts Đức ở Powershell được gọi bởi vbs

Dec 15 2020

tôi có một tệp ps1, tệp này tạo ra một Liên kết

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()

Tôi cũng có một tệp vbs gọi 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

Cả hai tệp đều được lưu bằng mã hóa utf-8.

Việc xây dựng này là cần thiết, bởi vì ps1 cần phải chạy hoàn toàn không có bất kỳ thứ gì đáng chú ý cho người dùng. Gọi một ps1 thông qua một vbs đã giải quyết được vấn đề này, nếu có cách nào tốt hơn, tôi sẽ rất vui nếu bạn cho tôi biết.

Nếu tôi đang gọi trực tiếp tập lệnh powershell hoặc với "powershell.exe Get-Content" "C: \ path \ to \ file \ create-link.ps1" "| PowerShell.exe -noprofile" (bằng cách sử dụng cmd) thì mọi thứ đều hoạt động tốt . Tuy nhiên, nếu tôi gọi các vbs để thực hiện công việc nói chung, nhưng âm sắc tiếng Đức từ 'Mô tả' chỉ là dấu hỏi, vì vậy bằng cách nào đó mã hóa đã bị xáo trộn. Có cách nào để sửa lỗi này không?

Trả lời

2 mklement0 Dec 15 2020 at 20:59

tl; dr:

  • Lưu *.ps1tệp của bạn dưới dạng UTF-8 với BOM .

  • Đơn giản hóa lệnh của bạn bằng cách sử dụng PowerShell CLI 's -Filetham số:

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

Xem thêm: GitHub vấn đề # 3028 , trong đó yêu cầu khả năng khởi chạy PowerShell bản thân hoàn toàn ẩn - obviating sự cần thiết của một aux. Tập lệnh VBScript - phiên bản tương lai có thể hỗ trợ (nhưng nó sẽ không được chuyển ngược lại sang Windows PowerShell).


Nếu bạn đang sử dụng Windows PowerShell (phiên bản lên đến v5.1), bạn phải lưu *.ps1tệp của mình dưới dạng UTF-8 với BOM để chúng được diễn giải chính xác đối với các ký tự bên ngoài dải ASCII (7-bit), chẳng hạn như äöüß.
Điều này không còn cần thiết trong PowerShell [Core] v6 + , luôn được mặc định là UTF-8, nhưng nếu tập lệnh của bạn cần chạy trong cả hai phiên bản, bạn nên luôn sử dụng UTF-8 với BOM .

Nếu một ký tự nhất định *.ps1không có BOM, Windows PowerShell sẽ diễn giải từng byte là một phần của chuỗi mã hóa UTF-8 (tất cả các ký tự không phải ASCII đều được mã hóa thành 2-4 byte) riêng lẻ thành một ký tự, dựa trên ANSI hoạt động của hệ thống trang mã (mã hóa một byte như Windows-1252).

Trên hệ thống tiếng Anh-Mỹ, trong đó trang mã ANSI đang hoạt động là Windows-1252, chuỗi mẫu trên do đó hiển thị dưới dạng chuỗi rác äöüß

Lưu ý rằng các dấu chấm hỏi, hay chính xác hơn là các trường hợp của (NHÂN VẬT THAY THẾ U+FFFD), sẽ chỉ xuất hiện trong trường hợp ngược lại : khi văn bản được mã hóa ANSI bị hiểu sai thành UTF-8.


Ngoài ra, hãy nói lại cách tiếp cận của bạn trong việc cung cấp mã nguồn cho PowerShell CLI thông qua đường dẫn (stdin) :

Vì tập lệnh của bạn dường như chạy ẩn, nó sẽ không tạo ra sự khác biệt trong trường hợp của bạn, nhưng lưu ý rằng kỹ thuật này thể hiện chế độ tương tác giả và cũng không hỗ trợ truyền các đối số tới tập lệnh được cung cấp qua stdin - xem GitHub issue # 3223