создание цитируемого пути для ярлыка с аргументами в PowerShell

У меня есть следующий код PowerShell, вызывающий WSHShell, который создаст ярлык в меню «Пуск» для Win7 / 8, но я не могу понять, как заставить Powershell передавать кавычки, необходимые для UNC-пути до аргументов в целевой строке.

Что я хочу: аргумент "\\ UNCPATH1 \ Directory \ application.exe "A АргументB

Что я получаю: \\ UNCPATH1 \ Directory \ application.exe аргументA АргументB

Текущий код:

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$env:ProgramData\Microsoft\Windows\Start Menu\Programs\supercoolprogram\mrincredible.lnk")
$Shortcut.TargetPath = "\\UNCPATH1\Directory\application.exe"
$Shortcut.Arguments = "argumentA ArgumentB"
$Shortcut.WorkingDirectory = "\\UNCPATH1\Directory"
$Shortcut.Save()

Редактировать с примерами кода ... спасибо TheMadTechnician и Speerian, у которых были рабочие примеры. Windows удаляет цитируемые пути в целевом поле из ярлыков, у которых нет пробела в UNC-пути приложения. Оба примера кода работают с путями с пробелами.

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$env:ProgramData\Microsoft\Windows\Start Menu\Programs\supercoolprogram\mrincredible.lnk")
$Shortcut.TargetPath = "`"\\UNCPATH1\Directory1\application.exe`""
$Shortcut.Arguments = "argumentA ArgumentB"
$Shortcut.WorkingDirectory = '"\\UNCPATH1\Directory1"'
$Shortcut.Save()

or

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$env:ProgramData\Microsoft\Windows\Start Menu\Programs\supercoolprogram\mrincredible.lnk")
$Shortcut.TargetPath = """\\UNCPATH1\Directory 1\application.exe"""
$Shortcut.Arguments = "argumentA ArgumentB"
$Shortcut.WorkingDirectory = "\\UNCPATH1\Directory 1"
$Shortcut.Save()

Во втором примере обратите внимание на пробел в пути UNC и удаление одинарных кавычек из рабочего каталога в атрибутах ярлыка. (окна добавятся сюда автоматически)


person thatotheritguy    schedule 04.08.2015    source источник
comment
У меня возникла противоположная проблема. Я не включаю кавычки при установке TargetPath, но они добавляются в результирующий ярлык.   -  person Sam Rueby    schedule 12.11.2018


Ответы (2)


Поместите вашу строку в кавычки в другие кавычки, так "\\UNCPATH1\Directory\application.exe" станет '"\\UNCPATH1\Directory\application.exe"'.

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$env:ProgramData\Microsoft\Windows\Start Menu\Programs\supercoolprogram\mrincredible.lnk")
$Shortcut.TargetPath = '"\\UNCPATH1\Directory\application.exe"'
$Shortcut.Arguments = "argumentA ArgumentB"
$Shortcut.WorkingDirectory = '"\\UNCPATH1\Directory"'
$Shortcut.Save()

Изменить: ... и я ошибался. Это работает для свойства WorkingDirectory, но не для свойства TargetPath. Что - это заключить строку в тройные кавычки. Итак, это приводит нас к следующему:

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$([environment]::GetFolderPath("Desktop"))\mrincredible.lnk")
$Shortcut.TargetPath = """\\UNCPATH1\Directory 1\application.exe"""
$Shortcut.Arguments = "argumentA ArgumentB"
$Shortcut.WorkingDirectory = '"\\UNCPATH1\Directory"'
$Shortcut.Save()

По крайней мере, отлично работает в Windows 8.1.

person TheMadTechnician    schedule 04.08.2015
comment
Это работает для предоставления кавычек в начале поля, однако в целевом поле все еще отображается: \\ UNCPATH1 \ Directory \ application.exe argumentA ArgumentB Как добраться ... Я попробовал двойные и тройные кавычки, заключив их в одинарные кавычки, и не смог Не получается правильно отформатировать цель. - person thatotheritguy; 04.08.2015
comment
Требуются ли кавычки для пути, который вы используете? Если этого не произойдет, он не будет их применять. - person TheMadTechnician; 04.08.2015
comment
Интересный. Я изменил целевой путь и, таким образом, начал с пути, чтобы включить пробел, и он действительно добавил кавычки вокруг приложения. Нет способа передать их, если явно не требуется? Кроме того, обратите внимание, что рабочий каталог будет автоматически завершен до указанного пути с использованием одинарных кавычек, если это необходимо. Как указано выше, начало пути в сокращенном виде будет заключено в двойные кавычки. Обновленный код будет размещен после оригинала. - person thatotheritguy; 04.08.2015
comment
Или используйте апостроф: $Shortcut.TargetPath = '"\\UNCPATH1\Directory 1\application.exe"'. - person Hans Ginzel; 29.11.2016

Вы можете избежать кавычек, используя `. Это другой символ на клавише "~".

$Shortcut.TargetPath = "`"\\UNCPATH1\Directory\application.exe`""
person Speerian    schedule 04.08.2015
comment
Галочка не заставляет кавычки на путь без пробелов. Ищете способ принудительно установить кавычку в целевом поле ярлыка. TheMadTechnician имеет правильный синтаксис, если в пути UNC есть пробел. И код функционирует, как указано для начала, с его синтаксисом, независимо от пробелов в пути UNC. - person thatotheritguy; 04.08.2015
comment
@thatotheritguy Для меня кавычки сохраняются либо с пробелами, либо без пробелов. Я могу упустить то, что вы имеете в виду, заставляя цитату. - person Speerian; 04.08.2015
comment
Когда я использую то, что указано выше: $ Shortcut.TargetPath = "\\UNCPATH1\Directory\application.exe, я получаю \\ UNCPATH1 \ Directory \ application.exe аргументA АргументB Я пытаюсь получить: \\ UNCPATH1 \ Directory \ application.exe аргументA ArgumentB в целевом поле создал ярлык. Если в пути UNC есть пробел, опубликованный код добавит кавычки вокруг пути к целевому приложению. если без пробела, без кавычек. - person thatotheritguy; 04.08.2015
comment
Хорошо, просто попробовал немного вручную отредактировать путь, и когда я добавляю кавычки вручную в путь UNC без пробелов, они удаляются при нажатии кнопки «Применить». Похоже, Windows удаляет кавычки из целевого пути, если они не нужны, даже когда они явно вызываются при создании. - person thatotheritguy; 04.08.2015