BATCH 文件中多个文件名的条件 IF EXIST 语句

Posted

技术标签:

【中文标题】BATCH 文件中多个文件名的条件 IF EXIST 语句【英文标题】:Conditional IF EXIST Statement for multiple filenames in BATCH file 【发布时间】:2018-10-01 21:57:07 【问题描述】:

我正在处理以下批处理脚本,但我不确定如何才能获得我正在寻找的结果。我在这里和在线搜索,但我没有看到任何看起来像我正在寻找的东西。任何帮助表示赞赏。

我需要检查两个文件是否存在以及是否不存在。目前我已经让下面的代码工作了,但是如果一个文件存在或丢失,它会进入第三个方向(我已经更新了代码以考虑第三个方向,所以现在它工作正常,但我知道还有很多空间为了改进!)。我知道它不漂亮,但它可以工作,而漂亮的代码却不行。

请注意,同一目录下还有其他扩展名相同的文件,因此无法按扩展名搜索。

工作代码:

@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

单独检查两个文件不起作用的示例

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

【问题讨论】:

见self answer 【参考方案1】:

为什么要perenthesize?简单地试试。

@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

【讨论】:

我已经对此进行了测试,您没有考虑到 1 个文件可能丢失或存在,这将失败/通过检查。 (抱歉刚刚更新了页面,我可以看到你已经更改了代码。) 如果存在条件检查两个文件,如果其中一个不存在,则不完成。再次测试,我之前进行了编辑,因为我看错了问题 谢谢这些都是很好的建议,但我开始意识到使用“如果不存在”是多余的。 LotPings 上面第二个较低的示例是我正在寻找的答案。【参考方案2】:
:again
for %%a in ("file1.exe" "file2.zip") do if not exist "%%~a" call :download "%%~a" &goto again

然后编写一个内部过程来下载作为%1提供的丢失文件

您可能想要安装一个计数器并在:download 过程中报告是否正在执行下载,如果是,则报告哪个文件 - 并计算迭代次数以在下载经常失败时停止进程.

这里的一个优点是括号中可以包含的文件名的数量没有真正的限制

【讨论】:

【参考方案3】:

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

【讨论】:

这不起作用,正如我上面提到的。编辑:显然你不能在 cmets 中发布代码,所以我会在上面发布。 抱歉,问题肯定是其他原因 - 上面的代码在这里运行。 我很抱歉,你是对的。您上面的代码确实“按书面”工作。已经很晚了,我还没有想清楚。在修改代码以考虑我的脚本的结构后,我能够让它工作。【参考方案4】:

找到了解决方案!添加了一些 if exists 参数来说明空文件夹。

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..

【讨论】:

【参考方案5】:

下载并执行

@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

【讨论】:

以上是关于BATCH 文件中多个文件名的条件 IF EXIST 语句的主要内容,如果未能解决你的问题,请参考以下文章

Windows 批处理文件:多个 if 条件

使用BATCH文件使用文件中的部分行重命名多个文件

Spring Batch中如何读取多个CSV文件合并数据进行处理?

使用多个 if 条件时如何克服 ValueError?

Spring Batch - 从 S3 读取多个文件

在 IF 语句中具有多个条件的 PDO MySQL SELECT