Я пытаюсь автоматизировать создание ярлыков в Windows в сценарии PowerShell. Я создал функцию, чтобы упростить эту задачу, поскольку мне нужно передать аналогичный ярлык в нескольких местах при запуске скрипта, но каждый раз, когда я пытаюсь передать аргумент для открытия определенного файла, поле «Аргументы» опускается.
Если я сделаю:
Function MakeAShortcut($RunPath, $Arguments, $ShortcutName, $ShortcutLocation){
$WScriptShell = New-Object -ComObject WScript.Shell
$Shortcut = $WScriptShell.CreateShortcut($ShortcutLocation + $ShortcutName + '.lnk')
$Shortcut.Targetpath = -join($RunPath,"\Notepad++.exe")
$Shortcut.Arguments = "C:\tests\testfile.txt"
$Shortcut.WorkingDirectory = $RunPath
$Shortcut.IconLocation = -join($RunPath,"\Notepad++.exe",", 0")
$Shortcut.Save()
Write-Host "`nShortcut created at "$ShortcutLocation$ShortcutName'.lnk'
}
$DefaultFileName = "C:\tests\testfile.txt"
$Runapppath = "C:\Program Files\Notepad++"
MakeAShortcut $Runapppath $DefaultFileName "ShortcutTEST" "c:\tests\"
Затем сценарий выведет ярлык, который правильно запускает программу (в данном случае Notepad ++), и файл по умолчанию для загрузки с ярлыком (testfile.txt).
Однако, если я это сделаю:
Function MakeAShortcut($RunPath, $Arguments, $ShortcutName, $ShortcutLocation){
$WScriptShell = New-Object -ComObject WScript.Shell
$Shortcut = $WScriptShell.CreateShortcut($ShortcutLocation + $ShortcutName + '.lnk')
$Shortcut.Targetpath = -join($RunPath,"\Notepad++.exe")
$Shortcut.Arguments = $Arguments
$Shortcut.WorkingDirectory = $RunPath
$Shortcut.IconLocation = -join($RunPath,"\Notepad++.exe",", 0")
$Shortcut.Save()
Write-Host "`nShortcut created at "$ShortcutLocation$ShortcutName'.lnk'
}
$DefaultFileName = "C:\tests\testfile.txt"
$Runapppath = "C:\Program Files\Notepad++"
MakeAShortcut $Runapppath $DefaultFileName "ShortcutTEST" "c:\tests\"
Затем он просто полностью отбрасывает поле $Shortcut.Arguments
(независимо от того, загружаю ли я $DefaultFileName
как переменную или явную строку) и создает ярлык, который запускает только программу (в данном случае Notepad ++)
Я пробовал заключить в тройные кавычки значение, передающееся в позицию $DefaultFileName
. Я попытался выделить такие символы, как двоеточие и т. д. Если я передам что-то дополнительно (пример: $Shortcut.Arguments = '-noPlugins ' + $Arguments
, он добавит только добавление (-noPlugins). Я пробовал использовать другое имя переменной, отличное от $Arguments
. Я пробовал делать [string]$Arguments
в объявлении параметров и $Arguments.ToString()
в использовании.
Не могли бы вы помочь мне понять, что я делаю не так?
РЕДАКТИРОВАТЬ - Спасибо TessellatingHeckler за то, что он указал мне, что это было что-то с компьютерами, на которых я действительно делал этот скрипт, что предотвращало это. Теперь выясним, почему ...
Ну тогда раскрась меня тупицей. Я закрыл ISE / перезагрузил и т. д. На компьютерах, на которых работал над этим скриптом, но только сейчас при тестировании этого на моем домашнем компьютере он действительно работал. Думаю, пора выяснить, какая дурацкая настройка на моей основной рабочей станции и ноутбуке (обоих) вызывает это. Спасибо за вашу помощь и терпение в ответ на очевидный вопрос.
Это просто происходило для меня, и я нашел ваш пост в поисках решения (которого я нигде не нашел). Сделав вашу строку эквивалентом этой, я решил исправить это:
$Shortcut.Arguments = [string]$Arguments
Поэтому по какой-то причине необходимо преобразование, чтобы присвоить переменной правильный тип.
Работает для меня. Скопировал второй кодовый блок, заменил
c:\tests
на папку, которая существует на моем компьютере, и я получил ярлык для"C:\Program Files\Notepad++\Notepad++.exe" C:\tests\testfile.txt
. Какую среду вы используете? Версия ОС, версия PS, и закрывали ли вы / снова открывали PS между запусками, просто чтобы проверить, что ничего не зависает от предыдущего запуска?