Как передать необходимые параметры скрипту в Powershell ISE?

См. Заголовок.

Я указал необходимые параметры в заголовке скрипта:

param ($G_ARCHIVE = $(throw "Need file to upload!"),
       $G_LOGFILE = $(throw "Need logfile!"))

Когда я хочу отладить сценарий с помощью Powershell ISE: как я могу заполнить эти параметры?


person eckes    schedule 14.01.2011    source источник


Ответы (4)


Используйте панель команд. Откройте файл сценария в редакторе ISE, установите точки останова (F9). Затем в области команд введите команду, вызывающую этот сценарий с необходимыми параметрами. Я не думаю, что есть другой (встроенный) способ сделать это в ISE.

person Roman Kuzmin    schedule 14.01.2011
comment
Этот подход не сработал для меня, поскольку в моем пути к файлу были пробелы, решением было использовать функцию амперсанда следующим образом: PS C: \ Windows ›& (c: \ my folder \ script.ps1) -myArg 123 -anotherArg abc - person Emil G; 08.09.2014
comment
Фактически вы можете использовать относительный путь:. \ Script.ps1 - person Ashraf Alam; 25.09.2014

  1. Откройте скрипт (myscript.ps1) в Windows Powershell ISE.
  2. Нажмите F9 на переменной, которую вы хотите проверить (отладить). Например, вторая строка в примере ниже, где присваивается переменная $ outputText.
  3. В окне оболочки укажите относительный путь к сценарию вместе со значением параметра. Например:. \ Myscript.ps1 "мое значение"
  4. Нажмите Enter (нажимать F5 необязательно)
  5. Вы сможете увидеть точки останова отладки, выделенные желтым цветом. Установите курсор на нужную переменную, чтобы проверить текущее значение.

Пример, показывающий отладку PowerShell с ISE и параметром команды

person Ashraf Alam    schedule 25.09.2014
comment
чем этот ответ отличается от принятого? - person eckes; 25.09.2014
comment
Мысль, объясняя более подробную информацию с помощью иллюстраций, будет полезна другим. Например, требуется указать относительное (или абсолютное) местоположение, которое не было предусмотрено изначально. - person Ashraf Alam; 25.09.2014

Есть другой способ. Вы можете использовать автоматическую переменную $PSDefaultParameterValues, которая существует (начиная с версии 3), чтобы предоставить новые аргументы по умолчанию для командлетов и расширенных функций (не работает с обычными функциями). Однако это действительно работает для сценариев, даже при отладке в ISE. Вы должны объявить [CmdletBinding()] или [Parameter()], как если бы вы делали расширенную функцию.

Итак, для вашего примера,

[CmdletBinding()]
param ($G_ARCHIVE = $(throw "Need file to upload!"),
$G_LOGFILE = $(throw "Need logfile!"))

вы бы выполнили что-то вроде этого в приглашении ISE:

$PSDefaultParameterValues.add("ExampleScript.ps1:G_ARCHIVE","File-to-upload.txt")
$PSDefaultParameterValues.add("ExampleScript.ps1:G_LOGFILE","Example.log")

Вы также можете установить значение параметра в блок скрипта, который будет автоматически выполняться во время выполнения:

$PSDefaultParameterValues["ExampleScript.ps1:G_LOGFILE"]={
  "Example-{0:yyMMddHHmm}.log" -f [datetime]::Now
}

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

Сделав это таким образом, вы можете просто нажать F5, чтобы запустить ваш скрипт как обычно. Параметры будут взяты из переменной, поэтому вам не нужно ничего вводить.

Другими вариантами использования $PSDefaultParameterValues могут быть настройки, например, если Get-History получит только последние 10 записей, если вы не укажете параметр -Count в команде. Поскольку записи сохраняются только для текущего сеанса, вам нужно добавить настройки в свой профиль. Вы можете узнать больше, набрав Get-Help about_Parameters_Default_Values в командной строке, или просмотреть ту же информацию на TechNet.

person PatrickFranchise    schedule 22.09.2015
comment
Еще один пример блока скрипта. Вы можете настроить свой скрипт на автоматическое использование новейшего zip-файла. $PsDefaultParameterValues=["ExampleScript.ps1:G_ARCHIVE"]={(ls *.zip | sort lastwritetime | select -last 1).fullname} Такие вещи очень полезны, когда вы постоянно создаете новые версии некоторых внешних наборов данных для тестирования и отладки вашего скрипта. - person PatrickFranchise; 10.04.2016
comment
$ PSDefaultParameterValues.Item (KEY) = VALUE - еще одна альтернатива - person RichardOD; 06.12.2016
comment
Он работает только в сценариях, когда параметры объявлены с помощью декоратора [Parameter()], чего нет в примере @eckes. - person Laurent CAPRANI; 27.04.2018
comment
Ты прав. Я упоминал, что это должна быть расширенная функция, но не то, что вы должны делать то же самое со сценарием. - person PatrickFranchise; 30.04.2018

Есть гораздо более простой способ установить необходимые параметры в ISE:

Перед нажатием F5 в ISE установите нужный вам параметр. Я обычно комментирую нужный мне параметр, например: # $ G_ARCHIVE = "C: \ Temp \ TestFile_001.txt"

Я выбираю все после "#" и нажимаю F8. В следующий раз, когда я отлажу сценарий с помощью F5, для параметра будет установлено значение, с которым я тестирую, нет необходимости передавать параметры через командную строку.

person S. Barij    schedule 19.01.2016