Windows 将批处理文件递归扫描一段时间,如果存在,则将其添加到zip总是失败
下面是一个批处理文件,它接受2个或更多参数。Windows 将批处理文件递归扫描一段时间,如果存在,则将其添加到zip总是失败,windows,batch-file,cmd,Windows,Batch File,Cmd,下面是一个批处理文件,它接受2个或更多参数。 第一个参数应为搜索文件的基本目录(例如D:\temp) 第二个参数和连续参数应为要搜索的文件名模式(例如2017_02_01或myapp) 批处理文件将执行以下操作 检查第一个参数是否为空,并显示相应的消息 检查第一个参数是否不存在目录或显示适当的消息 调用一个子例程来解析每个参数并对其执行操作 在子例程中,检查参数中是否有任何不需要的符号,并显示相应的消息 在子例程中,不要对第一个参数执行操作 在子例程中,检查作为第一个参数的基本目录中是否存在文件
@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
变量将永远无法正确读取。您需要延迟扩展。选中“是”,延迟扩展是必要的,变量应在感叹号之间使用,而不是在百分比之间使用。