Powershell - создание ярлыка с файлом в качестве аргумента

Я пытаюсь автоматизировать создание ярлыков в 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 за то, что он указал мне, что это было что-то с компьютерами, на которых я действительно делал этот скрипт, что предотвращало это. Теперь выясним, почему ...

Работает для меня. Скопировал второй кодовый блок, заменил c:\tests на папку, которая существует на моем компьютере, и я получил ярлык для "C:\Program Files\Notepad++\Notepad++.exe" C:\tests\testfile.txt. Какую среду вы используете? Версия ОС, версия PS, и закрывали ли вы / снова открывали PS между запусками, просто чтобы проверить, что ничего не зависает от предыдущего запуска?

TessellatingHeckler 02.05.2018 05:08

Ну тогда раскрась меня тупицей. Я закрыл ISE / перезагрузил и т. д. На компьютерах, на которых работал над этим скриптом, но только сейчас при тестировании этого на моем домашнем компьютере он действительно работал. Думаю, пора выяснить, какая дурацкая настройка на моей основной рабочей станции и ноутбуке (обоих) вызывает это. Спасибо за вашу помощь и терпение в ответ на очевидный вопрос.

A. S. 02.05.2018 06:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
1 196
1

Ответы 1

Это просто происходило для меня, и я нашел ваш пост в поисках решения (которого я нигде не нашел). Сделав вашу строку эквивалентом этой, я решил исправить это:

$Shortcut.Arguments = [string]$Arguments

Поэтому по какой-то причине необходимо преобразование, чтобы присвоить переменной правильный тип.

Другие вопросы по теме