Как запросить $args при отсутствии
Мой сценарий:
$computername=$args[0]
if ($args -eq $null) { $computername = Read-Host "enter computer name" }
Get-ADComputer -Id $computername -Properties * | select name,description
Если я передам аргумент с помощью сценария, то есть:
get-ComputerName.ps1 computer01
это работает отлично. Однако, если я пропускаю компьютер, я хочу, чтобы он подсказал мне, но вместо этого я получаю эту ошибку:
Get-ADComputer: Невозможно проверить аргумент параметра "Идентичность". Аргумент нулевой. Укажите правильное значение аргумента и попробуйте запустить команда снова. В U: \ get-ADComputer-назначенный-user.ps1:9 символ:20 + Get-ADComputer -Id $computername -Properties * | выберите имя, описание + ~~~~~~~~~~~~~ + CategoryInfo: InvalidData: (:) [Get-ADComputer], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.GetADComputer
Я не могу понять, как заставить это работать.
2 ответа
Не используйте автоматическую переменную $args
, но определите конкретный обязательный параметр для имени компьютера:
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true, Position=0)]
[string]$ComputerName
)
Get-ADComputer -Id $ComputerName -Properties * | Select-Object Name, Description
Это позволит вам запустить ваш скрипт так:
./Get-ComputerName.ps1 -ComputerName computer01
или вот так:
./Get-ComputerName.ps1 computer01
Если параметр отсутствует, вам будет предложено ввести его:
PS C:\> ./Get-ComputerName.ps1
cmdlet test.ps1 at command pipeline position 1
Supply values for the following parameters:
ComputerName: _
Если вы хотите, чтобы скрипт выдавал ошибку вместо запроса отсутствующего параметра, вы можете сделать это следующим образом:
[CmdletBinding()]
Param(
[Parameter(Mandatory=$false, Position=0)]
[string]$ComputerName = $(throw 'Parameter missing!')
)
Get-ADComputer -Id $ComputerName -Properties * | Select-Object Name, Description
Обратитесь к документации для получения дополнительной информации об обработке параметров в PowerShell.
Похоже, что $args всегда будет там, поэтому ($args -eq $null) всегда будет ложным. Чтобы увидеть, пуст ли $args, вы можете сделать
if ($args.Length -eq 0)