尝试/捕获或If/Else?

Jos*_*han 3 powershell if-statement credentials try-catch

你好,我很难找到如何让这个脚本工作,我是非常新的脚本,但我很了解它,但仍然找出一些事情.

try {
    Test-Connection -Computername $_ -count 1 -ErrorAction Stop
} catch {
    $_.Exception.ErrorCode -eq 0x800706ba
} `
{
    $err = 'Unavailable (Host Offline or Firewall)'
}

try {
    Test-UserCredentials -Username testuser -Password (Read-Host -AsSecureString)
} catch {
    $_.CategoryInfo.Reason -eq 'UnauthorizedAccessException'
} `
{
    $err = 'Access denied (Check User Permissions)'
}

Write-Warning "$computer- $err" | Out-File -FilePath c:\temp\Folder\Errors.txt -Append
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是这个脚本来测试系统是否响应.如果为True则下一步将是测试凭据,最后一步是执行get-wmiobject查询.但是如果系统没有响应ping,那么我想捕获无法响应ping的主机名,捕获它并将其导出到txt并在凭证失败时执行相同操作.

Ans*_*ers 7

try..catch用于处理终止错误.不要滥用它来进行状态检查,因为强制检查在不需要的时候会很难.如果您只想测试Test-Connection以参数-Quiet作为if条件运行的系统的可用性:

if (Test-Connection -ComputerName $_ -Count 1 -Quiet) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果需要级联多个检查,则可以通过反转检查并使用适当的消息返回,以更易读的方式执行此操作:

function Test-Multiple {
  ...
  if (-not (Test-Connection -ComputerName $_ -Count 1 -Quiet)) {
    return "Host $_ unavailable."
  }

  $pw = Read-Host -AsSecureString
  if (-not (Test-UserCredentials -Username testuser -Password $pw)) {
    return 'Login failed for user testuser.'
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果您想在日志文件中获取有关ping或登录失败的信息,可以将其附加到相应的文件中:

function Test-Multiple {
  ...
  if (-not (Test-Connection -ComputerName $_ -Count 1 -Quiet)) {
    $_ | Add-Content 'C:\path\to\unavailable.log'
    return
  }

  $pw = Read-Host -AsSecureString
  if (-not (Test-UserCredentials -Username testuser -Password $pw)) {
    $_ | Add-Content 'C:\path\to\login_failure.log'
    return
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)