2017-03-27 1 views
2

Derzeit verwende ich dieses Skript, um ein Datum in yyyyMMdd Format in dd/MM/yyyy Format zu konvertieren.Wie Erfassen Powershell-Fehler in Batch-Skripts?

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

Wenn ich Eingabe ungültiger Zeichen/Datum-Zeit-Struktur für die %testDate% Variable, in Powershell IDE, eine Fehlermeldung führt, "String was not recognized as a valid DateTime".

In Batch-Skripts wird jedoch nur eine leere testDate Variable zurückgegeben. Es gibt auch errorlevel = 0 zurück.

Wie gebe ich die Fehlermeldung von Powershell in Batch-Skripten zurück?


Voll Skript

@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

put try/catch [Batch try/catch] (http: // Stackoverflow

A try/catch Anweisung kann dies zu erreichen, verwendet werden.com/fragen/21772060/Batch-Datei-try-catch). [Fehlerbehandlung im Stapel] (http://stackoverflow.com/questions/1164049/batch-files-error-handling) –

+0

@RanadipDutta, was ich möchte, ist die Fehlermeldung von Powershell erzeugt, nicht meinen eigenen Fehler erstellen Nachricht, wenn ein Problem vorliegt. – Mark

+0

Warum überhaupt eine Batch-Datei verwenden? Schreiben Sie einfach das gesamte Skript in PowerShell. Viel, viel einfacher. –

Antwort

1

Die Fehlermeldung aus [datetime]::parseexact wird in mehreren Textzeilen zurückgegeben und bewirkt, dass die set testData=%%a mehrmals aufgerufen wird. Sie können dies sehen, indem Sie den Befehl separat ausführen.

z.

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 

output:

C: \ Temp> Set Testdate = Exception "ParseExact" durch "3" -Argument Aufruf (e): „String nicht als gültiges
C erkannt wurde: \ Temp> SET testDate = DateTime. "
C: \ Temp> SET = Datumtest Bei Zeile: 1 Zeichen: 4
C: \ Temp> SET Testdate = + & {([Datetime] :: ParseExact ('Exception ParseExact mit 3 ARGUM Aufruf ...
C: \ Temp> SET TestDatum = + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~
C: \ Temp> Set Testdate = + CategoryInfo: NotSpecified: (:) [], MethodInvocationException
C: \ Temp> Set Testdate = + FullyQualifiedErrorId: Format
C : \ Temp> SET testDate =

Um dies zu beheben, müssen Sie Steuern Sie die Rückmeldung, wenn ein Fehler auftritt.

@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) 

oder

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

oder

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

je nachdem, was die Umstände sind. Sind Sie sicher, dass testdate geändert wird (erstes Szenario) - ich bin verdächtig, dass tatsächlich testdate bleibt so wie es ist und eventdate wird einfach nicht gesetzt.

+0

Hallo, ich habe die Frage aktualisiert, um das vollständige Skript anzuzeigen. Außerdem zielte ich darauf ab, die Fehlermeldung aus dem Powershell-Prozess, die durch ungültige Zeichen verursacht wurde, auszugeben und keine eigenen benutzerdefinierten Nachrichten zu erstellen. Entschuldigung, dass ich nicht klar genug war. – Mark