Не похоже, что вам нужен обязательный параметр вообще. Чтобы сделать его обязательным, потребуется ввод, который делает значение по умолчанию бесполезным. Однако вернемся к описанной вами ошибке.
Атрибут работает как положено. Проблема в том, как вы называете свой сценарий. Давайте попробуем следующий код как функцию и скрипт:
[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 ""