IF EXIST C:\directory\ goto a else goto b 问题 windows XP 批处理文件

Posted

技术标签:

【中文标题】IF EXIST C:\\directory\\ goto a else goto b 问题 windows XP 批处理文件【英文标题】:IF EXIST C:\directory\ goto a else goto b problems windows XP batch filesIF EXIST C:\directory\ goto a else goto b 问题 windows XP 批处理文件 【发布时间】:2011-03-16 06:36:00 【问题描述】:

每当我在下面运行code 时,我都会在使用 if exists 行时出错,因为无论目录是否存在,它都好像该行从未存在过......要么或者它没有读取 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  

【问题讨论】:

检查目录的权限? 权限很好,因为目录当前不存在。目前我还不担心网络副本。 在第二组中,您缺少 GOTO 指令。 goto oldexists else oldexistscontinue 谢谢,后来当我把它们放在下一行时,我自己注意到了。 【参考方案1】:

如果您想排除 else 部分的任何问题,请尝试删除 else 并将命令放在新行上。像这样:

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

【讨论】:

【参考方案2】:

DOS 批处理语言中有 ELSE 吗?在我做更多此类事情的日子里,没有。

如果我的理论是正确的并且你的 ELSE 被忽略了,你最好还是这样做

IF NOT EXIST file GOTO label

...这也将为您节省一行代码(IF 之后的代码)。

其次,我隐约记得在测试目录是否存在时出现了某种错误。如果您可以测试该目录中是否存在文件,生活会更轻松。如果没有您可以确定的文件,可以尝试的方法(在 Win95、IIRC 上都可以使用)将设备文件名 NUL 附加到您的目录名称中,例如

IF NOT EXIST C:\dir\NUL GOTO ...

【讨论】:

我在 windows xp 批处理脚本中工作,不确定 dos,但它可以工作,因为你的帖子发现了我的错误,robvanderwoude.com/ntif.php 总结了它。还要感谢方便的 nul 提示,没有我可以可靠检查的文件。 也感谢不存在,提示保存一行,但我喜欢我得到它的方式,因为我可以将标签想象为“伪大括号” Carl:这个站点上的绝大多数批处理问题都与 DOS 无关。虽然许多人错误地声称他们在询问有关 DOS 批处理文件的问题,但他们通常都在 Windows 上工作,并且指的是 Windows 命令处理器cmd.exe。与command.com 的语法相比,语法表面上相似但大大扩展。简单地将两者归为一类是完全错误的。 COMMAND.COM 被改写为cmd.exe;并且针对常见问题的各种解决方法已被附加到命令的子集上。这当然是一个意见问题,但我否认与旧 DOS 相比的变化与你想象的一样剧烈。恰当的例子:我对 DOS 语法的过时知识帮助 OP 解决了他的问题。 但我承认,在给定的上下文中提及 DOS 是错误的,并且对提问者造成了不必要的混淆。【参考方案3】:

使用括号对各个分支进行分组:

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

在您的情况下,解析器永远不会看到属于ifelse,因为goto 会很乐意接受直到命令结束的所有内容。使用 echo 而不是 goto 时,您会看到类似的问题。

同时使用括号可以让您直接使用语句而不必跳来跳去(尽管我无法重写您的代码以实际使用结构化编程技术;也许现在还为时过早,或者它不适合块结构,就像现在的代码一样)。

【讨论】:

这个测试不区分文件和目录。 @JaroslavZáruba:确实如此,请注意尾随的反斜杠。 是的,我的错,我测试了其他答案中建议的两个反斜杠和点,我道歉...我玛在其他地方向你投赞成票:)【参考方案4】:

来自帮助 (if /?):

ELSE 子句必须与 IF 之后的命令出现在同一行。为了 例子: 如果存在文件名。 ( del 文件名。 ) 别的 ( 回显文件名。失踪。 ) 以下将不起作用,因为需要终止 del 命令 通过换行符: 如果存在文件名。 del 文件名。 ELSE 回显文件名。失踪 以下内容也不起作用,因为 ELSE 命令必须在同一行 作为 IF 命令的结尾: 如果存在文件名。 del 文件名。 ELSE 回显文件名。失踪

【讨论】:

不过,这并不能说明全部情况。 goto 使用整行而不是仅使用一个令牌并不是很明显。这里记录了del,这是有道理的,但直观地说,这对于goto 来说并不明显。 如果del 命令需要用换行符终止,是否有任何其他命令也不需要用换行符终止的理由? 混淆可能在于“ELSE 子句必须与 IF 之后的命令出现在同一行”我这样做了,但它没有用。当时我不明白使用括号使其与 IF 相同。因为从非编程的角度来看,它们是不同的行。有换行符!【参考方案5】:
@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

【讨论】:

【参考方案6】:

要检查 DIRECTORIES,您不应使用以下内容:

if exist c:\windows\

要正常使用:

if exist c:\windows\\.

注意“。”最后。

【讨论】:

无论何时要检查目录是否存在,都必须使用两个栏,在这种情况下,C:分区的根目录中可能有一个名为“windows”的文件 至少在 Windows 7 上,如果文件存在,exist C:\file\.exist C:\file\\. 都是正确的,所以这个技巧对我不起作用。 :-( 这完全是错误的。该语法不区分文件夹或文件。 if exist c:\windows` frequently works, but can fail if dealing with a junction point or symbolic link. The simplest code that seems to always work is 如果存在 c:\windows*`.

以上是关于IF EXIST C:\directory\ goto a else goto b 问题 windows XP 批处理文件的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1346. Check If N and Its Double Exist

删除表如果它存在于 Oracle (IF EXIST) [重复]

批处理 if exist 判断两个文件

2020-02-111346. Check If N and Its Double Exist

DOS/BAT批处理if exist else 语句的几种用法

matlab中的exist是啥意思