web-dev-qa-db-ja.com

存在する場合C:\ directory \ goto a else goto b issues windows XPバッチファイル

以下のcodeを実行すると、ディレクトリが存在するかどうかに関係なく、if exist行を使用してエラーが発生します。または、else行を読み取っていません。


echo off  
echo  
echo (c) Ryan Leach 2010  
echo Stockmaster Backup System for exclusive use of Riverland Paper Supplies  
echo  
echo Please ensure that all computers are out of stock master to the windows xp screen  
echo and that the backup usb with the day of the week labeled on it is inserted  

pause  

IF EXIST D:\RPS_BACKUP\backups_to_Zip\ goto zipexist else goto zipexistcontinue  
:zipexist  
IF EXIST d:\RPS_BACKUP\backups_old\ rd /s /q D:\RPS_BACKUP\backups_old  
echo backup did not complete last time, backup will restart from Zip-usb phase.  
pause  
call Zip  
goto tidyup  
:zipexistcontinue  

IF EXIST D:\RPS_BACKUP\backups_old\ goto oldexists else oldexistscontinue  
:oldexists  
IF EXIST d:\RPS_BACKUP\backup_temp\ rename D:\RPS_BACKUP\backups_temp backups_to_Zip  
rd /s /q D:\RPS_BACKUP\backups_old  
echo backup did not complete last time, backup will restart at the Zip to usb phase.  
pause  
call Zip  
goto tidyup  
:oldexistscontinue  

IF EXIST D:\RPS_BACKUP\backups_temp\ goto tempexists else goto tempexistscontinue  
:tempexists  
IF EXIST D:\RPS_BACKUP\backups_old\ goto backupfailed else goto tempexistscontinue  
:backupfailed  
@rd /s /q D:\RPS_BACKUP\backups_temp  
echo backup did not complete last time, backup will restart from start.  
pause  
:tempexistscontinue  

md D:\RPS_BACKUPS\backups_temp  
xcopy \\user1\c\* D:\RPS_BACKUP\backups_temp\user1\c /h /e /z /f /r /i /s /k  
IF NOT ERRORLEVEL == 1 GOTO ErrorHandler  
xcopy C:\* D:\RPS_BACKUP\backups_temp\user2\c /h /e /f /r /i /s /k  
IF NOT ERRORLEVEL == 1 GOTO ErrorHandler  
xcopy \\user3\c\* D:\RPS_BACKUP\backups_temp\user3\c /h /e /z /f /r /i /s /k  
IF NOT ERRORLEVEL == 1 GOTO ErrorHandler  
call sub  
call Zip  
:tidyup  
rename D:\RPS_BACKUP\backups_to_Zip backups  
pause  
goto :eof  

:ErrorHandler  
echo xcopyerrorcode is ERRORLEVEL contact ryan  
pause  
9
Ryan The Leach

括弧を使用して、個々のブランチをグループ化します。

IF EXIST D:\RPS_BACKUP\backups_to_Zip\ (goto zipexist) else goto zipexistcontinue

あなたの場合、パーサーはelseに属するifを見ることはありません。なぜなら、gotoはコマンドの最後まですべてを喜んで受け入れるからです。 echoの代わりにgotoを使用すると、同様の問題が発生することがあります。

また、括弧を使用すると、ジャンプすることなくステートメントを直接使用できます(実際に構造化プログラミング技術を使用するようにコードを書き換えることはできませんでした;多分早すぎるか、構造をブロックするのに適していませんコードは今です)。

19
Joey

else部分の問題を除外する場合は、elseを削除して、コマンドを新しい行に配置してください。このような:

IF EXIST D:\RPS_BACKUP\backups_temp\ goto tempexists
goto tempexistscontinue  
7
Prutswonder

ヘルプから(if /?):

 ELSE句は、IFの後のコマンドと同じ行になければなりません。 For ..____。] example:
 
 IF EXIST filename。 (
 del filename。
)ELSE(
 echo filename。missing。
)
 
 delコマンドは、改行で終了する必要があります
:
 
 IF EXIST filename。 delファイル名。 ELSEエコーファイル名。 missing 
 
 IFコマンドの最後と同じ行
にある必要があるため、次の作業も行われません。
 
ファイル名が存在する場合。 del filename。
 ELSEエコーファイル名。行方不明
5
Gabe

DOSバッチ言語にはELSEがありますか?私がこの種のことをもっとした時代に戻ってはいませんでした。

私の理論が正しく、あなたのELSEが無視されている場合、あなたは

IF NOT EXIST file GOTO label

...これにより、コード行(IFの直後)も節約されます。

第二に、ディレクトリの存在をテストする際のある種のバグを漠然と覚えています。そのディレクトリ内のファイルの存在をテストできれば、人生は楽になります。確信できるファイルがない場合、試してみる(Win95、IIRCまで使用されていた)ことは、デバイスファイル名NULをディレクトリ名に追加することです。

IF NOT EXIST C:\dir\NUL GOTO ...
2
Carl Smotricz
@echo off

:START
rmdir temporary
cls
IF EXIST "temporary\." (echo The temporary directory exists) else echo The temporary directory doesn't exist
echo.
dir temporary /A:D
pause

echo.
echo.
echo Note the directory is not found
echo.
echo Press any key to make a temporary directory, cls, and test again
pause

Mkdir temporary
cls
IF EXIST "temporary\." (echo The temporary directory exists) else echo The temporary directory doesn't exist
echo.
dir temporary /A:D
pause
echo.
echo press any key to goto START and remove temporary directory 
pause 

goto START
1
Edoctoor

ディレクトリを確認するには、次のようなものを使用しないでください。

if exist c:\windows\

適切に使用するには:

if exist c:\windows\\.

「。」に注意してください最後に。

0
Mike Emery