2016-04-27 14 views
2

コンピュータへのpingのエラーレベルが0ではないのにこのスクリプトを次の部分に移動しようとしていますが、動作させることができません。出力に構文が正しくないと表示されます。ありがとうございました。バッチスクリプト - Forループでerrorlevelをスキップする

@echo 
setlocal EnableDelayedExpansion 

for /f %%a in (main.txt) do ( 
ping -n 1 %%a > NUL 
IF %ERRORLEVEL%==0 (GOTO :COPY) ELSE GOTO :SKIP 

:COPY 
ROBOCOPY C:\Blah C:\Bloh 
ECHO FILE COPIED 

:SKIP 
ECHO FILE NOT COPIED 
) 

答えて

2

あなたはこれを試してみてください:あなたのコードが間違って物事のカップルがあります

@echo 
setlocal EnableDelayedExpansion 

for /f %%a in (main.txt) do ( 
    ping -n 1 %%a >NUL 
    IF "!ERRORLEVEL!"=="0" (
    ROBOCOPY "C:\Blah" "C:\Bloh" 
    ECHO FILE COPIED 
) ELSE (
    ECHO FILE NOT COPIED 
) 
) 
PAUSE 

。まず、遅延拡張を有効にしますが、実際には使用しません。!内の変数のみが遅延展開されます。私はまたあなたのファイルパスの周りに引用符を入れて、スペースやものを含むパスからそれらを保護します。最後に、gotoおよびラベルは、あなたがforループのようなコードの括弧のブロック内でif elseロジック

+0

優秀、ありがとう、これは私が必要とした方法で動作します。あなたはそれをとてもうまく説明して、何か新しいことを学んだ。 – MPineda

0

goto :Labelでそれらを交換する必要があるので、forループ内では機能しませんブロック/ループコンテキストを壊すので、ラベルのコードがありますあたかもブロック/ループの外側にあるかのように実行されます。したがって、そのことを回避する必要があります。それを行うにはどのような方法アウト


Dennis van Gilsポイント - if/elseを用いた論理(彼の方法と同様に、次のわずかに変更されたスニペット(数値比較を適用)の両方がdelayed expansionが必要です):

setlocal EnableDelayedExpansion 
for "usebackq" /F %%A in ("main.txt") do (
    > nul ping -n 1 %%A 
    if !ErrorLevel! EQU 0 (
     robocopy "C:\Blah" "C:\Bloh" 
     echo FILE COPIED 
    ) else (
     echo FILE NOT COPIED 
    ) 
) 
endlocal 

for "usebackq" /F %%A in ("main.txt") do (
    > nul ping -n 1 %%A 
    if ErrorLevel 1 (
     echo FILE NOT COPIED 
    ) else (
     robocopy "C:\Blah" "C:\Bloh" 
     echo FILE COPIED 
    ) 
) 

delayed expansionの必要性を回避

またはこのような、

ErrorLevelゼロ(非)に対してを確認するには、あなたも&&||operatorsを使用することができます。

最後に
for "usebackq" /F %%A in ("main.txt") do (
    > nul ping -n 1 %%A || (
     echo FILE NOT COPIED 
    ) && (
     robocopy "C:\Blah" "C:\Bloh" 
     echo FILE COPIED 
    ) 
) 

、あなたがgoto :Label構造を維持したいならば、あなたが使用する必要があります()ブロックの外側のコードのこの部分を移動させるためにサブ・ルーチンは、(あなたもここにdelayed expansionは必要ありません):

for "usebackq" /F %%A in ("main.txt") do (
    > nul ping -n 1 %%A 
    call :SUB "C:\Blah" "C:\Bloh" 
) 
exit /B 

:SUB 
if %ErrorLevel% NEQ 0 goto :SKIP 
robocopy "%~1" "%~2" 
echo FILE COPIED 
:SKIP 
goto :EOF 
関連する問題