Как запросить $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)
Другие вопросы по тегам