powershell - Try/Catch 还是 If/Else?

标签 powershell if-statement try-catch credentials

大家好,我在试图弄清楚如何使这个脚本工作时遇到了麻烦,我对脚本非常陌生,但我确实了解其中的大部分内容,但仍在弄清楚一些事情。

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

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

最佳答案

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

if (Test-Connection -ComputerName $_ -Count 1 -Quiet) {
  ...
}

如果您需要级联多个检查,您可以通过反转检查并返回适当的消息以更易读的方式进行:

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.'
  }
  ...
}

如果您想在日志文件中获取有关 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
  }
  ...
}

关于powershell - Try/Catch 还是 If/Else?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268628/

相关文章:

powershell - 从文本文件读取变量并将其设置为当前 PowerShell session 环境变量

powershell - 在 Powershell 中为小文件获取 "size on disk"

java - ZXing SCAN_RESULT if 语句

c - 如果语句不起作用?

redirect - Kohana 3.3 : How to handle Redirects within Try. ..捕捉 block

javascript - 理解 Javascript 中的 try..catch

Powershell 随机选择和计数

.net - 从 PowerShell 暂停或休眠

c - 使用二分搜索在排序数组的正确位置插入一个元素以找到正确的位置,但是出现运行时错误

SQL try-catch 语句未处理错误 (SQL Server 2008)