Windows 将批处理文件递归扫描一段时间,如果存在,则将其添加到zip总是失败

Windows 将批处理文件递归扫描一段时间,如果存在,则将其添加到zip总是失败,windows,batch-file,cmd,Windows,Batch File,Cmd,下面是一个批处理文件,它接受2个或更多参数。 第一个参数应为搜索文件的基本目录(例如D:\temp) 第二个参数和连续参数应为要搜索的文件名模式(例如2017_02_01或myapp) 批处理文件将执行以下操作 检查第一个参数是否为空,并显示相应的消息 检查第一个参数是否不存在目录或显示适当的消息 调用一个子例程来解析每个参数并对其执行操作 在子例程中,检查参数中是否有任何不需要的符号,并显示相应的消息 在子例程中,不要对第一个参数执行操作 在子例程中,检查作为第一个参数的基本目录中是否存在文件

下面是一个批处理文件,它接受2个或更多参数。

  • 第一个参数应为搜索文件的基本目录(例如D:\temp)
  • 第二个参数和连续参数应为要搜索的文件名模式(例如2017_02_01或myapp)
  • 批处理文件将执行以下操作

  • 检查第一个参数是否为空,并显示相应的消息
  • 检查第一个参数是否不存在目录或显示适当的消息
  • 调用一个子例程来解析每个参数并对其执行操作
  • 在子例程中,检查参数中是否有任何不需要的符号,并显示相应的消息
  • 在子例程中,不要对第一个参数执行操作
  • 在子例程中,检查作为第一个参数的基本目录中是否存在文件模式参数。 在这里,检查失败,并且总是返回不正确的1
  • 如果file pattern参数存在,则采取类似于使用7zip将文件添加到临时zip文件的操作。 对于其余的参数也是如此
  • 如果参数为空,则停止子例程
  • 下面是批处理文件

    @echo off
    set BASE_DIR=%1
    
    REM check if first argument is empty and display appropriate message
    set NEW_DIR=%BASE_DIR%X
    if %NEW_DIR%==X goto displayUsage
    
    REM check if first argument is not existing directory or display appropriate message
    if not exist %BASE_DIR% goto displayUsage
    cd /d C:\temp\
    if exist "C:\temp\temp.zip" del /q /f "C:\temp\temp.zip"
    call :subr %*
    exit /b
    
    :subr
    rem check if any unwatned symbols are in arguments
    if exist "C:\temp\temp.txt" del /q /f "C:\temp\temp.txt"
    echo %* > "C:\temp\temp.txt"
    findstr /r ".*[<>/|?*%%].*" "C:\temp\temp.txt" >nul
    if %errorlevel% equ 0 goto displayUsage
    
    rem start parsing each argument
    for %%A in (%*) do (
        if not %%A==%BASE_DIR% (
            rem check if file exists and take action on it
            pushd %BASE_DIR%
            dir /b /s /a-d *%%A* | find "File not found"
            set FILE_EXISTS=%errorlevel%
            rem HERE FILE_EXISTS STATUS IS ALWAYS 1 IRRESPECTIVE OF FILE PRESENCE
            popd
            if %FILE_EXISTS% equ 0 (
                rem take action on the file like add it to a zip file
                "7za.exe" a -r -y "C:\temp\temp.zip" %BASE_DIR%\*%%A*.*
            ) else (
                echo File %%A does not exists in %BASE_DIR%
            )
        ) else (
            echo No need to parse base directory %%A
        )
    )
    exit /b
    
    :displayUsage
    echo Usage: create-logs-zip.bat existing-base-directory log-file-name
    echo Do not use symbols: ^< ^> / ? ^| ^*
    goto end
    
    :end
    if exist "C:\temp\temp.zip" del /q /f "C:\temp\temp.zip"
    if exist "C:\temp\temp.txt" del /q /f "C:\temp\temp.txt"
    exit /b
    
    @echo关闭
    设置基目录=%1
    REM检查第一个参数是否为空,并显示相应的消息
    设置新目录=%BASE目录%X
    如果%NEW_DIR%==X转到displayUsage
    REM检查第一个参数是否不存在目录或显示适当的消息
    如果不存在%BASE\u DIR%goto displayUsage
    cd/d C:\temp\
    如果存在“C:\temp\temp.zip”del/q/f“C:\temp\temp.zip”
    电话:subr%*
    退出/b
    :subr
    rem检查参数中是否有未指定的符号
    如果存在“C:\temp\temp.txt”del/q/f“C:\temp\temp.txt”
    echo%*>“C:\temp\temp.txt”
    findstr/r“*[/|?*%%].*”C:\temp\temp.txt“>nul
    如果%errorlevel%equ 0转到displayUsage
    rem开始解析每个参数
    对于%%A in(%*)do(
    如果不是%%A==%BASE\u DIR%(
    rem检查文件是否存在并对其采取措施
    pushd%基本目录%
    目录/b/s/a-d*%a*|查找“未找到文件”
    设置文件\u存在=%errorlevel%
    rem此处文件_存在状态始终为1,与文件存在无关
    邻苯二胺
    如果%FILE\u存在%eq 0(
    rem对文件执行类似于将其添加到zip文件的操作
    “7za.exe”a-r-y“C:\temp\temp.zip”%BASE\u DIR%\*%a**
    )否则(
    %BASE\u DIR%中不存在回显文件%%A
    )
    )否则(
    echo无需分析基本目录%%A
    )
    )
    退出/b
    :displayUsage
    echo用法:create-logs-zip.bat现有基本目录日志文件名
    echo不使用符号:^<^>/?^|^*
    转到终点
    :结束
    如果存在“C:\temp\temp.zip”del/q/f“C:\temp\temp.zip”
    如果存在“C:\temp\temp.txt”del/q/f“C:\temp\temp.txt”
    退出/b
    
    任何人都可以指出检查文件存在的错误,并分享为什么它总是返回1


    请求:请不要将power shell、cmdlet或VB脚本作为备选方案。

    延迟扩展是必要的,变量应在感叹号之间使用,而不是百分比。以下是按预期工作的摘录

    for %%A in (%*) do (
        if not %%A==%BASE_DIR% (
        PushD "%BASE_DIR%"
        dir /b /s /a-d *%%A* 2>null>&2
        set FILE_EXISTS=!errorlevel!
        PopD
        if !FILE_EXISTS! equ 0 (%ZIPTOOL% a -r -y %TEMPZIP% %BASE_DIR%\*%%A*.*) else (echo File %%A is not found)
        ) else (
        echo Skipping compressing of base-directory %%A
        )
    )
    

    我已经十年没有处理批处理文件了,但在Bash中,“未找到文件”错误消息将转到STDERR,并且
    find
    命令将看不到该消息。您的
    文件\u EXISTS
    变量将永远无法正确读取。您需要延迟扩展。选中“是”,延迟扩展是必要的,变量应在感叹号之间使用,而不是在百分比之间使用。