【问题标题】:How to capture powershell error in batch scripts?如何在批处理脚本中捕获 powershell 错误?
【发布时间】:2017-03-27 03:51:58
【问题描述】:

目前,我正在使用此脚本将yyyyMMdd 格式的日期转换为dd/MM/yyyy 格式。

for /f "delims=" %%a in ('powershell -Command "& {([datetime]::parseexact('%testDate%','yyyyMMdd',[System.Globalization.CultureInfo]::InvariantCulture)).ToString('dd/MM/yyyy')}"') do SET testDate=%%a

当我在 Powershell IDE 中为 %testDate% 变量输入无效字符/日期时间结构时,它会抛出错误消息 "String was not recognized as a valid DateTime"

但是,在批处理脚本中,它只会返回一个空的 testDate 变量。它还返回errorlevel = 0

如何在批处理脚本中从 powershell 返回错误消息?


完整脚本

@echo off
setlocal enabledelayedexpansion
REM Get user's inputs
:beginning
SET /p testDate="Please enter the date in yyyyMMdd format (e.g., 20171128)" || goto beginning
if /I "%testDate%"=="t" (
    for /f "delims=" %%a in ('powershell -Command "& get-date -format 'dd/MM/yyyy'"') do SET testDate=%%a
) ELSE (
    if /I "%testDate%"=="yt" (
        for /f "delims=" %%a in ('powershell -Command "& get-date (get-date).AddDays(-1) -format 'dd/MM/yyyy'"') do set testDate=%%a
    ) ELSE (
        for /f "delims=" %%a in ('powershell -Command "& {([datetime]::parseexact('%testDate%','yyyyMMdd',[System.Globalization.CultureInfo]::InvariantCulture)).ToString('dd/MM/yyyy')}"') do SET testDate=%%a
        REM Testing 
        echo !testDate!
        echo Yes!
    )
)
REM Testing 
echo !testDate!
echo !errorLevel!
pause

【问题讨论】:

  • @RanadipDutta 我想要的是返回powershell生成的错误消息,而不是在出现问题时创建我自己的错误消息。
  • 为什么要使用批处理文件?只需在 PowerShell 中编写整个脚本。简单得多。

标签: powershell batch-file


【解决方案1】:

来自[datetime]::parseexact 的错误消息以多行文本形式返回,导致set testData=%%a 被多次调用。您可以通过单独运行命令来看到这一点。

例如。

c:\Temp> for /f "delims=" %a in ('powershell -Command "& {([datetime]::parseexact('%testDate%','yyyyMMdd',[System.Globalization.CultureInfo]::InvariantCulture)).ToString('dd/MM/yyyy')} "') do SET testDate=%a

输出:

C:\Temp> SET testDate=使用“3”个参数调用“ParseExact”异常:“字符串未被识别为有效
C:\Temp> SET testDate=DateTime。"
C:\Temp> SET testDate=行:1 字符:4
C:\Temp> SET testDate=+ & {([datetime]::parseexact('使用 3 个参数调用 ParseExact 的异常 ...
C:\Temp> SET testDate=+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~
C:\Temp> SET testDate= + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
C:\Temp> SET testDate= + FullyQualifiedErrorId : FormatException
C:\Temp> 设置测试日期=

要解决此问题,您需要在遇到错误时控制返回消息。

可以使用try/catch 语句来实现:

@echo off
setlocal enabledelayedexpansion
REM Get user's inputs
:beginning
SET /p testDate="Please enter the date in yyyyMMdd format (e.g., 20171128)" || goto beginning
if /I "%testDate%"=="t" (
    for /f "delims=" %%a in ('powershell -Command "& get-date -format 'dd/MM/yyyy'"') do SET testDate=%%a
) ELSE (
    if /I "%testDate%"=="yt" (
        for /f "delims=" %%a in ('powershell -Command "& get-date (get-date).AddDays(-1) -format 'dd/MM/yyyy'"') do set testDate=%%a
    ) ELSE (
        for /f "delims=" %%a in ('powershell -Command "& {try { ([datetime]::parseexact('%testDate%','yyyyMMdd',[System.Globalization.CultureInfo]::InvariantCulture)).ToString('dd/MM/yyyy') } catch { return $_.Exception.Message }} "') do SET testDate=%%a
        REM Testing 
        echo !testDate!
        echo Yes!
    )
)
REM Testing 
echo !testDate!
echo !errorLevel!
pause

【讨论】:

    【解决方案2】:
    if not defined testdate (echo Invalid date supplied)
    

    if not defined eventdate (echo Invalid date supplied %testdate%)
    

    if not defined eventdate (echo Invalid date supplied %testdate%&goto someplace)
    

    取决于具体情况。你确定testdate 需要修改吗(第一种情况) - 我怀疑testdate 保持原样而eventdate 根本没有设置。

    【讨论】:

    • 嗨,我已经更新了问题以显示完整的脚本。此外,我的目标是从 powershell 进程中输出由无效字符引起的错误消息,而不是创建自己的自定义消息。对不起,我不够清楚。
    猜你喜欢
    • 2011-11-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2012-02-21
    • 2011-10-25
    • 2018-04-13
    • 2019-05-23
    相关资源
    最近更新 更多