在批处理文件中对多个文件名使用条件IF EXIST语句

4
我正在处理以下批处理脚本,但我不确定如何实现我所需要的结果。我在这里和网上搜索过,但没有看到像我需要的内容。非常感谢你的帮助。
我需要检查两个文件是否存在,以及它们是否不存在。目前我有下面的代码可以工作,但是如果一个文件存在或者缺失了,它会进入第三种情况(我已经更新了代码以解决第三种情况,现在它可以正常工作了,但我知道还有很多改进的空间!)。我知道它不太好看,但它能工作,而且漂亮的代码可能并不行得通。
请注意,同一目录下有其他具有相同扩展名的文件,因此按扩展名搜索将无效。
工作代码:
@echo off
echo checking file structure...
if exist "file1.exe" (
if exist "file2.zip" (
goto ok
)
)

if not exist "file1.exe" (
if not exist "file2.zip" (
goto download
)
)
if not exist "file1.exe" (
goto download
)
)

if not exist "file2.zip" (
goto download
)
)
:download
echo downloading missing files.
:ok
echo Install successful

我想要做的事情:

(以下代码不会起作用,只是我的思路记录)

@echo off
set file1=setup.exe
set file2=package.zip

if exist $file1 && $file2 then goto ok
else if not exist $file1 || $file2 goto download

为什么仅检查这两个文件是不够的示例

在IT技术方面。
echo checking file structure...
if exist "setup.exe" if exist "package.zip" goto TEST1
if not exist "setup.exe" if not exist "package.zip" goto TEST2
ECHO [Error!] - 1 File is present, the other is missing!
PAUSE
:TEST1
ECHO [Success!] - Found both files, YAY! 
PAUSE
:TEST2
ECHO [Error!] - No matching files found.
PAUSE

请参见自我回答 - user6811411
5个回答

4
括号在else语句中是必需的。
@echo off
echo checking file structure...
if exist "file1.exe" (
    if exist "file2.zip" (
        goto :ok
    ) else goto :download
) else goto :download

:download
echo downloading missing files.
:ok
echo Install successful

但是else语句并不是必需的,因为程序流会自动跳转到下载标签。
@echo off
echo checking file structure...
if exist "file1.exe" if exist "file2.zip"  goto :ok
:download
echo downloading missing files.
:ok
echo Install successful

这个不起作用,就像我上面提到的那样。 编辑:显然你不能在评论中发布代码,所以我会在上面发布它。 - Mike Roh
抱歉,但故障必须是其他问题 - 上面的代码在这里运行。 - user6811411
非常抱歉,你是正确的。你上面的代码确实可以“按原样”工作。当时已经很晚了,我的思维不够清晰。在修改代码以考虑到我的脚本结构后,我成功地让它工作了。 - Mike Roh

2
为什么要用括号?直接尝试就好。
@echo off
echo checking file structure...
if exist "file1.exe" if exist "file2.zip" echo Install successful
if not exist "file1.exe" echo downloading missing "file1.exe"
if not exist "file2.zip" echo downloading missing "file2.zip"

或者在循环中:
@echo off
for %%i in ("file1.exe" "file2.zip") do if not exist "%%i" echo %%i Must be downloaded & goto :EOF
echo Successful Installation

我已经测试过了,你没有考虑到可能会缺少或存在一个文件,这将导致检查失败/通过。(抱歉刚刚更新了页面,我看到你已经改变了代码。) - Mike Roh
如果存在条件检查两个文件,如果任何一个不存在,则不会完成。再次测试,我之前进行了编辑,因为我误读了问题。 - Gerhard
谢谢,这两个建议都很好,但我意识到使用“if not exist”是多余的。LotPings上面的第二个示例才是我要找的答案。 - Mike Roh

0
找到了解决方案!添加了一些 if 存在参数来考虑空文件夹。
for /D %%I in ("%~dp0*") do ( 
    cd /D %%I
    if exist *pm.wav (
        if exist *.xml (
            tar -cvzf %%~nxI.tar.gz *pm.wav *.xml
        )
    )
)
cd..

0

下载并执行

@echo off
echo checking file structure...
if exist "C:\Users\Himel\Desktop\5MB.zip" (
if exist "C:\Users\Himel\Desktop\5MB.zip" (
goto ok
)
)

if not exist "C:\Users\Himel\Desktop\5MB.zip" (
if not exist "C:\Users\Himel\Desktop\5MB.zip" (
goto download
)
)
if not exist "C:\Users\Himel\Desktop\5MB.zip" (
goto download
)
)

if not exist "C:\Users\Himel\Desktop\5MB.zip" (
goto download
)
)
:download
echo downloading missing files.

SETLOCAL

rem FOR DOWNLOADING FILES, THIS SCRIPT IS USING THE "BITSADMIN.EXE" SYSTEM FILE.
rem IT IS PRESENT ON MOST WINDOWS VERSION, PROBABLY FROM WINDOWS XP TO WINDOWS 10.


:SETUP

rem URL (5MB TEST FILE):
SET "FILE_URL=http://ipv4.download.thinkbroadband.com/5MB.zip"

rem SAVE IN CUSTOM LOCATION:
rem SET "SAVING_TO=C:\Folder\5MB.zip"

rem SAVE IN THE CURRENT DIRECTORY
SET "SAVING_TO=5MB.zip"
SET "SAVING_TO=%~dp0%SAVING_TO%"

:MAIN

ECHO.
ECHO DOWNLOAD SCRIPT EXAMPLE
ECHO.
ECHO FILE URL: "%FILE_URL%"
ECHO SAVING TO:  "%SAVING_TO%"
ECHO.

rem UNCOMENT AND MODIFY THE NEXT LINE IF YOU NEED TO USE A PROXY SERVER:
rem CALL :DOWNLOAD_PROXY_ON "PROXY-SERVER.COM:8080"

rem THE MAIN DOWNLOAD COMMAND:
CALL :DOWNLOAD_FILE "%FILE_URL%" "%SAVING_TO%"

rem UNCOMMENT NEXT LINE FOR DISABLING THE PROXY (IF YOU USED IT):
rem CALL :DOWNLOAD_PROXY_OFF

:RESULT
ECHO.
IF EXIST "%SAVING_TO%" ECHO YOUR FILE HAS BEEN SUCCESSFULLY DOWNLOADED.
IF NOT EXIST "%SAVING_TO%" ECHO ERROR, YOUR FILE COULDN'T BE DOWNLOADED.
ECHO.

:EXIT_SCRIPT
PAUSE
EXIT /B




rem FUNCTIONS SECTION


:DOWNLOAD_FILE
    rem BITSADMIN COMMAND FOR DOWNLOADING FILES:
    bitsadmin /transfer mydownloadjob /download /priority FOREGROUND %1 %2
GOTO :EOF

:DOWNLOAD_PROXY_ON
    rem FUNCTION FOR USING A PROXY SERVER:
    bitsadmin /setproxysettings mydownloadjob OVERRIDE %1 "<local>"
GOTO :EOF

:DOWNLOAD_PROXY_OFF
    rem FUNCTION FOR STOP USING A PROXY SERVER:
    bitsadmin /setproxysettings mydownloadjob NO_PROXY
GOTO :EOF
share  


:ok
echo Install successful

0
:again
for %%a in ("file1.exe" "file2.zip") do if not exist "%%~a" call :download "%%~a" &goto again

然后编写一个内部过程来下载提供的缺失文件%1
可能您希望在:download过程中安装一个计数器并报告正在执行的下载,以及如果是哪个文件 - 并计算迭代次数,以防下载失败太多次而停止该过程。
这里的优点是,圆括号中可以包含的文件名数量没有实际限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接