我有一个批处理脚本,询问路径,并询问我要在该路径中的文件夹和子文件夹中搜索的文件类型。然后它返回output.txt文件中这些文件的路径。
这是我的代码:
@echo on
set LOGFILE=output.txt
set /P userInputPath=Enter the path you'd like to search?
set /p "FileType=Enter file type(s) here (ex: txt, pdf, docx): "
call :LOG > %LOGFILE%
exit
:LOG
for %%A in (%FileType%) do (dir /b /s %userInputPath%\*.%%A)
@pause
我想避免创建output.txt文件,如果没有找到文件或输入的路径错误。任何人都可以帮我这个。谢谢!
答案 0 :(得分:2)
你可以添加
for %%# in ("%LOGFILE%") do (
if %%~z# equ 0 (
del /s /q "%LOGFILE%"
)
)
在最后。它检查日志文件的大小是否为0,如果是,则删除它。
答案 1 :(得分:2)
当没有处理数据时,你可以使用for /F
命令返回 ExitCode 为1的能力,即:
(for /F "delims=" %%A in ('dir /b /s "%userInputPath%\*.%FileType%"') do echo %%A) > %LOGFILE% || rem
if errorlevel 1 del %LOGFILE%
请注意,此代码使用而不是子例程调用...
您可以在this question的for /F
命令中阅读有关如何使用ExitCode值的详细说明;寻找退出代码管理。
答案 2 :(得分:1)
如果使用FOR命令列出文件,它将永远不会将输出重定向到日志文件,因为如果FOR命令不迭代任何文件名,则echo命令永远不会执行。
@echo off
set "LOGFILE=output.txt"
del "%logfile%"
:LOOP
set /P "userInputPath=Enter the path you'd like to search;"
set /p "FileType=Enter file type(s) here (ex: txt, pdf, docx):"
IF NOT EXIST "%userInputPath%" (
echo %userInputPath% does not exist
GOTO LOOP
)
for /R "%userInputPath%" %%G in (%FileType%) do echo %%G>>%LOGFILE%
pause
答案 3 :(得分:1)
另一个解决方案是查找具有隐藏文件属性集的文件,这些文件被命令 FOR 忽略:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "LOGFILE=output.txt"
set /P "userInputPath=Enter the path you'd like to search: "
set /P "FileType=Enter file type(s) here (ex: txt, pdf, docx): "
del "%LOGFILE%" 2>nul
for %%A in (%FileType%) do (
for /F "delims=" %%B in ('dir /A-D /B /S "%userInputPath%\*.%%A" 2^>nul') do (
>>"%LOGFILE%" echo %%B
)
)
endlocal
此解决方案较慢,因为内部 FOR 读取命令 DIR 输出的所有行,下一步输出以处理 STDERR 重定向到日志文件。
命令 DIR 输出的错误消息将重定向到设备 NUL 以禁止它们。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
del /?
dir /?
echo /?
endlocal /?
for /?
set /?
setlocal /?
另请参阅Microsoft TechNet文章Using command redirection operators。