Запрет интерактивных запросов значений параметров в сценариях - PullRequest
0 голосов
/ 14 марта 2019

У меня есть скрипт, pingtest.ps1, который делает следующий вызов:

Start-abc -SourceIpaddress x.y.x.z -Protocol TCP -DestinationIpAddress a.c.d.e

Во время выполнения запрашивает порт источника и порт назначения.

Как мне избежать этих интерактивных приглашений и вместо этого передать значения в том же сценарии?

1 Ответ

0 голосов
/ 15 марта 2019

ТЛ; др

Добавление чего-то вроде -SourcePort 42 и -DestinationPort 666 к вашему вызову Start-abc должно препятствовать этим интерактивным подсказкам (конечно, вы должны предоставить соответствующие значения вместо примеров значений 42 и 666, используемых здесь).

Чтобы определить точное название этих параметров и справочную информацию, читайте дальше.


Если при вызове команды не предоставляются аргументы для всех ее обязательных параметров (параметров, которым для работы команды необходимы значения):

  • PowerShell в интерактивном режиме запрашивает эти аргументы
  • и только если вы предоставите все необходимые аргументы (используя допустимые значения), команда действительно будет выполнена.

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


Если вы просто хотите запретить интерактивные приглашения при время выполнения , запустите вашу команду через новый экземпляр PowerShell, запущенный с -noninteractive:

powershell.exe -noninteractive -file C:\path\to\pingtest.ps1

Таким образом, ваш скрипт не будет запрашивать и сообщать о ошибке вместо , которая указывает имя (первого) обязательного параметра, для которого нет аргумента был предоставлен.

Предупреждение : При обработке ошибок по умолчанию выполнение скрипта все равно будет продолжаться ; установка $ErrorActionPreference = 'Stop' предотвратит это.


Если вы хотите определить во время разработки , какие параметры являются обязательными , используйте
Get-Command <command> -Syntax.

Если необходимо и доступно, добавьте Get-Help -Detailed <command> (или -Full) или Get-Help -Parameter <parameterName> <command>, чтобы узнать подробности о параметрах.
Однако обратите внимание, что пользовательские сценарии и функции могут не иметь справочной информации, связанной с ними.

Синтаксические диаграммы PowerShell не так легко расшифровать, но они говорят вам, какие параметры являются обязательными.

Используя в качестве примера командлет Get-Item:

PS> Get-Command Get-Item -Syntax

Get-Item [-Path] <string[]> [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>] [-Force] [-Credential <pscredential>] [-UseTransaction] [-Stream <string[]>] [<CommonParameters>]

Get-Item -LiteralPath <string[]> [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>] [-Force] [-Credential <pscredential>] [-UseTransaction] [-Stream <string[]>] [<CommonParameters>]
  • Каждая выходная строка представляет отдельный набор параметров .

    • Какие параметры отличают один набор параметров от другого, не очевидно; в этом случае это -Path против -LiteralPath, что характерно для командлетов, связанных с провайдером.
  • В данном наборе параметров любой параметр, который не заключен в [...] в целом (около оба параметр имя (например, -LiteralPath) и параметр тип (например, <string[]>)) является обязательным .

    • Если только параметр имя заключен в [...] (например, [-Path]), параметр также обязателен, но могут быть указаны аргументы позиционно - то есть вы можете опустить имя параметра и указать только аргумент (значение для привязки к параметру); например, вместо
      Get-Item -Path foo.txt вы можете указать только
      Get-Item foo.txt.

На основании вышеизложенного, вооруженный информацией о:

  • какой набор параметров вы будете использовать
  • каковы его обязательные параметры

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

...