vbs에서 호출하는 Powershell의 독일어 Umlauts

Dec 15 2020

링크를 만드는 ps1 파일이 있습니다.

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

또한 ps1을 호출하는 vbs 파일이 있습니다.

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

두 파일 모두 utf-8 인코딩으로 저장됩니다.

ps1은 사용자에게 눈에 띄는 것없이 완전히 헤드리스로 실행해야했기 때문에이 구성이 필요했습니다. vbs를 통해 ps1을 호출하면이 문제가 해결되었습니다. 더 좋은 방법이 있다면 알려 주시면 기쁠 것입니다.

powershell 스크립트를 직접 호출하거나 "powershell.exe Get-Content" "C : \ path \ to \ file \ create-link.ps1" "| PowerShell.exe -noprofile"(cmd 사용)을 사용하는 경우 모든 것이 제대로 작동합니다. . 그러나 작업을 수행하기 위해 vbs를 호출하면 일반적으로 작동하지만 'Description'의 독일어 움라우트는 물음표 일 뿐이므로 인코딩이 혼란스러워졌습니다. 이 문제를 해결할 방법이 있습니까?

답변

2 mklement0 Dec 15 2020 at 20:59

tl; dr :

  • BOM과 함께*.ps1 파일을 UTF-8로 저장합니다 .

  • PowerShell CLI 의 -File매개 변수 를 사용하여 명령을 단순화합니다 .

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

참고 항목 : GitHub 문제 # 3028 , PowerShell 자체를 완전히 숨겨서 aux가 필요하지 않게 시작할 수있는 기능을 요청합니다 . VBScript 스크립트- 향후 버전에서 지원할 수 있지만 Windows PowerShell로 백 포트되지 않습니다.


당신이 사용하는 경우 Windows PowerShell을 (버전 5.1까지 버전), 당신은 당신의 저장해야 *.ps1UTF-8로 파일을 BOM에와 그들을 ASCII (7 비트) 범위를 벗어난 자에 대하여 올바르게 해석하는 순서 같은 äöüß.
이는 일관되게 UTF-8로 기본 설정되는 PowerShell [Core] v6 + 에서는 더 이상 필요하지 않지만 스크립트를 버전 모두 에서 실행해야하는 경우 항상 BOM과 함께 UTF-8 사용해야 합니다.

지정된 항목 *.ps1에 BOM이없는 경우 Windows PowerShell 은 시스템의 활성 ANSI에 따라 UTF-8 인코딩 시퀀스 (모든 비 ASCII 문자는 2-4 바이트로 인코딩 됨 )의 일부인 각 바이트를 문자로 개별적 으로 해석 합니다. 코드 페이지 (Windows-1252와 같은 단일 바이트 인코딩).

활성 ANSI 코드 페이지가 Windows-1252 인 미국 영어 시스템에서 위의 샘플 문자열은 가비지 문자열로 표시됩니다. äöüß

물음표 또는 더 정확하게는 (REPLACEMENT CHARACTER, U+FFFD)의 인스턴스는 ANSI로 인코딩 된 텍스트가 UTF-8로 잘못 해석되는 반대 시나리오 에서만 나타납니다.


제쳐두고, 파이프 라인 (stdin)을 통해 PowerShell CLI에 소스 코드를 제공하는 방법을 다시 시도하십시오 .

스크립트가 숨김으로 실행되기 때문에 귀하의 경우에는 차이가 없지만이 기술은 의사 대화 형 모드를 나타내며 stdin을 통해 제공되는 스크립트에 인수 전달을 지원하지 않습니다. GitHub 문제 # 3223 참조