【问题标题】:Try/catch not working in Powershell console, but works in ISETry/catch 在 Powershell 控制台中不起作用,但在 ISE 中起作用
【发布时间】:2016-05-03 08:40:18
【问题描述】:

我有一个带有 try/catch 部分的 Powershell 脚本,用于将错误写入日志文件。这在 Powershell ISE 中工作得非常好,但在 Powershell 控制台中却不行。这是脚本:

$serverfile = "C:\Serverlist.txt"
$Logfile = "C:\Deploy_Log.txt"

$startdate= "01/05/2016"
$starttime = 13

Set-StrictMode -Version latest
$ErrorActionPreference = "Stop"
$WarningPreference = "Stop"

function LogWrite {
    param([string]$logstring)
    Add-Content $Logfile -Value $logstring
}

function DeployTask {
    param([string]$server1)

    $arguments = '/Create', '/S', "$server1", '/RU', 'domain\user', '/RP', 'pa$$w0rd', '/SC', 'ONCE', '/st', "$starttime`:00:00", '/sd', "$startdate", '/TN', 'Task_InstallUpdates', '/TR', 'C:\patchday\InstallUpdates.bat', '/RL', 'HIGHEST', '/F'
    Write-Host "$startdate, $starttime`:00"

    if (Test-Connection $server1 -Quiet) {
        # delete scheduled task
        try {
            schtasks.exe /S $server1 /delete /tn Task_InstallUpdates /f
        } catch {
            $ErrorMessage = $_.Exception.Message
            LogWrite "$server1 : Error deleting scheduled task - $ErrorMessage"
        }

        # create scheduled task
        try {
            & schtasks.exe $arguments
        } catch {
            $ErrorMessage = $_.Exception.Message
            LogWrite "$server1 : Error creating scheduled task - $ErrorMessage"
        }
    } else {
        LogWrite "$server1 is not available"
    }
}

$servers = Get-Content -Path $serverfile
foreach ($server1 in $servers) {
    Write-Host $server1
    try {
        DeployTask $server1
    } catch {
        $ErrorMessage = $_.Exception.Message
        LogWrite "$server1 : $ErrorMessage"
    }
}

有什么想法吗?我已将$ErrorActionPreference 和$WarningPreference 设置为“停止”并启用严格模式。在 ISE 中创建了日志文件,其内容如下所示:

srv17:创建计划任务时出错 - 警告:任务可能无法运行,因为 /ST 早于当前时间。
srv18:创建计划任务时出错 - 警告:任务可能无法运行,因为 /ST 早于当前时间。

在 Powershell 控制台中,不会创建日志文件,而是在控制台中显示所有错误和警告。

【问题讨论】:

  • 请edit您的问题并详细说明(详细)有什么区别?

标签: powershell try-catch powershell-3.0 powershell-ise


【解决方案1】:

您正在运行外部命令。这些通常不会引发 PowerShell 异常。改为评估$LASTEXITCODE:

$output = & schtasks.exe /S $server1 /delete /tn Task_InstallUpdates /f 2>&1
if ($LASTEXITCODE -ne 0) {
    LogWrite "$server1 : Error deleting scheduled task - $output"
}

# create scheduled task
$output = & schtasks.exe $arguments 2>&1
if ($LASTEXITCODE -ne 0) {
    LogWrite "$server1 : Error creating scheduled task - $output"
}

【讨论】:

  • 感谢您的回答,我还不知道 $LASTEXITCODE 变量。但是为什么他们会在 ISE 中抛出异常,而不是在控制台中呢?
  • 不知道为什么,但 ISE 是一个不同的主机环境,在某些方面与常规 PowerShell 控制台的行为不同。
【解决方案2】:

我也遇到了同样的问题,所以我找到了另一种处理错误的方法:

$error.clear() #before the command
<you commands>
if ($error.Count -gt 0){ #adter the commands
    $problem = $Error[0].Exception.Message
    Write-Host $problem

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多