从批处理脚本调用powershell脚本

时间:2014-11-05 18:08:18

标签: powershell batch-file

如果powershell脚本因任何原因失败,我需要一种能够让批处理脚本退出并写入日志文件的方法。

现在我有类似的东西:

SET DBSCRIPT=C:\Scripts\UpdateAppDB.ps1
IF EXISTS %DBSCRIPT% (
    POWERSHELL -Command %DBSCRIPT%
) ELSE (
    ECHO "Script not found." >> C:\TestResults\TestLog.txt`
    EXIT
)

有没有办法处理在运行powershell期间可能发生的错误?

1 个答案:

答案 0 :(得分:2)

如果出现错误,PowerShell命令应返回退出代码> 0。你可以像这样处理:

set "DBSCRIPT=C:\Scripts\UpdateAppDB.ps1"
if exists %DBSCRIPT% (
    powershell -Command %DBSCRIPT% || (
      rem Error handling routines here
    )
) else (
    echo "Script not found." >> C:\TestResults\TestLog.txt
    exit
)

或类似(需要启用延迟扩展):

setlocal EnableDelayedExpansion

set "DBSCRIPT=C:\Scripts\UpdateAppDB.ps1"
if exists %DBSCRIPT% (
    powershell -Command %DBSCRIPT%
    if !errorlevel! neq 0 (
      rem Error handling routines here
    )
) else (
    echo "Script not found." >> C:\TestResults\TestLog.txt
    exit
)

作为旁注:由于您要运行PowerShell脚本,我使用的是powershell -File "%DBSCRIPT%"而不是powershell -Command "%DBSCRIPT%"。变量周围的双引号可以处理路径中的潜在空格。

编辑:要明确,上述代码只处理来自PowerShell可执行文件或PowerShell脚本的非零返回码。它不会(也不能)替换PowerShell脚本中的错误处理。如果您希望PowerShell脚本终止所有错误(并使用非零退出代码指示错误状态),那么PowerShell脚本中至少需要这样的内容:

$ErrorActionPreference = "Stop"
try {
  # ...
  # rest of your code here
  # ...
} catch {
  Write-Error $_
  exit 1
}