Как разрешить powershell принимать пустую строку для именованного параметра? - PullRequest
0 голосов
/ 01 мая 2018

Я звоню в скрипт powershell:

powershell.exe -file basic.ps1 -User ""

У меня есть другие параметры, это немного разбавлено.

Скрипт PS принимает параметры:

[CmdLetBinding()]
param(
 [Parameter(Mandatory=$true)]
[AllowEmptyString()]
[string]$User = 't'
)

Когда я запускаю команду, я получаю:

Отсутствует аргумент для параметра 'Пользователь'. Укажите параметр типа «System.String» и повторите попытку.

Я предполагал, что AllowEmptyString позволит это?

1 Ответ

0 голосов
/ 01 мая 2018

Не похоже, что вам нужен обязательный параметр вообще. Чтобы сделать его обязательным, потребуется ввод, который делает значение по умолчанию бесполезным. Однако вернемся к описанной вами ошибке.

Атрибут работает как положено. Проблема в том, как вы называете свой сценарий. Давайте попробуем следующий код как функцию и скрипт:

[CmdLetBinding()]
param(
[Parameter(Mandatory=$true)]
[AllowEmptyString()]
[string]$User = 't'
)

"`$User has value '$user'. Is it null? $($user -eq $null). Type is $($user.GetType().Name)"

Демо-версия:

#Inside a function
PS> t -User ""
$User has value ''. Is it null? False. Type is String

#Inside a script
PS> .\Untitled-5.ps1 -User ""
$User has value ''. Is it null? False. Type is String

#Running the following command from cmd
cmd> powershell.exe -file Untitled-5.ps1 -User "" 
$User has value ''. Is it null? False. Type is String

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

PS> powershell.exe -file Untitled-5.ps1 -User "" 
D:\Downloads\Untitled-5.ps1 : Missing an argument for parameter 'User'. Specify a parameter of type 'System.String' and
 try again.
    + CategoryInfo          : InvalidArgument: (:) [Untitled-5.ps1], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingArgument,Untitled-5.ps1

Powershell.exe не предназначен для использования внутри PowerShell-процесса. Это можно исправить, вызвав сценарии непосредственно внутри PowerShell-процесса (второй пример), запустив PowerShell.exe … из cmd / run / запланированной задачи ++ (где-либо еще) или убедившись, что PS не анализирует ваши аргументы, поэтому он будет фактически введите кавычки.

Это можно сделать, выбрав кавычки

PS> powershell -File Untitled-5.ps1 -User `"`"

Или с помощью --%

PS> powershell -File Untitled-5.ps1 --% -User ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...