2017-03-27 2 views
2

現在、このスクリプトを使用して、yyyyMMdd形式の日付をdd/MM/yyyy形式に変換しています。バッチスクリプトでpowershellエラーをキャプチャするには?

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%変数のためのI入力に無効な文字/日時構造は、それはエラーメッセージをスローし、"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 
+0

プットのtry/catch [バッチのtry/catch](のhttp://のstackoverflow。com/questions/21772060/batch-file-try-catch)。 [バッチでのエラー処理](http://stackoverflow.com/questions/1164049/batch-files-error-handling) –

+0

@RanadipDutta私が欲しいのは、powershellで生成されたエラーメッセージを返すことです。自分のエラーを作成しません。問題が発生したときのメッセージ。 – Mark

+0

なぜバッチファイルを使用するのですか? PowerShellにスクリプト全体を書くだけです。ずっと簡単です。 –

答えて

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として認識されませんでした:\テンポ> SET testDate = DateTime。 "
C:ラインで\ Tempに> SET testDate =:1文字:4
C:\ Tempに> SET testDate = + & {([日時] :: parseexact(3 argumとParseExactを呼び出す '例外...
C:\ Temp> SET testDate = + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~
C:\ Tempに> SET testDate = + CategoryInfo:NotSpecified:(:) []、MethodInvocationException
C:\一時> SET testDate = + FullyQualifiedErrorId:FormatException
C :\ Temp> SET testDate =

この問題を解決するには、エラーが発生したときにリターンメッセージを制御します。

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 
0
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が設定されていないことは疑いがあります。

+0

こんにちは、私は完全なスクリプトを表示する質問を更新しました。また、私が目指したのは、独自のカスタムメッセージを作成するのではなく、無効な文字によるpowershellプロセスからのエラーメッセージを出力することでした。申し訳ありませんが、私は十分に明確ではありませんでした。 – Mark

関連する問題