ASCII в PowerShell (wscript.shell)

470
Brtrnd

Я создаю сценарий, который создает ярлыки для нашего диска архивации.
Я хотел бы, чтобы имя файла начиналось со знака Омега; поэтому окна всегда сортируют его внизу.
Вывод моего скрипта показывает знак омега; но созданная ссылка изменяет эту омегу на O (заглавная O). Вручную я могу сделать ярлык, который начинается со знака омега, поэтому он должен быть связан с wscript.shell

соответствующая часть сценария:

$locatie = $doel+"\Ω_archief "+$file.Name+".lnk" $Shell = New-Object -ComObject ("WScript.Shell") $ShortCut = $Shell.CreateShortcut($locatie) $ShortCut.TargetPath=$file.Fullname $Shortcut.Save() 
0
Я думаю, что объект Wscript.Shell не может работать с Unicode. Вы можете попробовать следующее: Создайте файл .lnk с временным именем, отличным от Unicode, а затем с помощью Powershell переименуйте его в свое имя Unicode. Sunzi 8 лет назад 1

1 ответ на вопрос

0
JosefZ

Проблема заключается в Save()методе в WScript.Shellярлыке объекта. Похоже, что этот вызов API требует ANSIимен для создания файла, таким образом подавляя символы из [System.Text.Encoding]::Default.

Однако вот обходной путь: создайте ярлык, используя хорошо различимое ANSIимя, а затем переименуйте его следующим образом:

$file = Get-ChildItem $MyInvocation.MyCommand.Path ### mcve $doel = "$env:USERPROFILE\Desktop\Test" ### mcve  $locatie = $doel+"\Ω_archief "+$file.Name+".lnk"  $locatieTemp = $locatie.Replace('\Ω_archief','\OMEGA_archief') $Shell = New-Object -ComObject ("WScript.Shell") $ShortCut = $Shell.CreateShortcut($locatieTemp) $ShortCut.TargetPath=$file.Fullname $Shortcut.Save()  if (Test-Path $locatie) { Remove-Item $locatie }  Move-Item -Path $locatieTemp $locatie  ### or Rename-Item instead of Move-Item: # Rename-Item -Path $locatieTemp $(Split-Path $locatie -Leaf) ### 

Обратите внимание, что первые две строки добавлены для соответствия правилам Minimal, Complete и Verifiable example (mcve).

это действительно, как я это сделал; основываясь на ответе Сунци. Я отметил ваше как решение, чтобы иметь возможность закрыть его. Brtrnd 8 лет назад 0