2017-01-23 61 views
4

我有一个批处理脚本,要求输入一个路径,并要求输入要在该路径中的文件夹和子文件夹中搜索的文件类型。然后它将路径返回到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的文件,如果没有文件被发现或IF输入的路径是错误的。任何人都可以帮助我这个。谢谢!

+0

使用'IF'命令和'EXIST'选项来检查文件夹是否存在。使用'FOR'命令和'/ R'选项列出文件。 – Squashman

+0

@Squashman如何在我的代码中使用这些命令?这是我第一次编写批处理脚本,但我对语法还不太熟悉。谢谢 – Alain

回答

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 
+0

这真的很接近我想要的。我唯一的问题是,当我使用一个好的路径和一个好的文件类型来运行脚本时,它不会打印我正在尝试查找路径的文件的路径。假设我搜索文件类型pdf,它将返回所有文件夹的路径并在最后添加pdf。 它看起来像这样: C:\ Users \用户名\桌面\测试\ PDF C:\ Users \用户名\桌面\测试\尼基果酱\ PDF C:\ Users \用户名\桌面\测试\ Prince Royce \ pdf – Alain

+0

没关系。我明白了,谢谢。只是好奇,你是否在循环之前添加了删除日志文件,只是为了清除任何现有的日志文件,或者还有其他原因? – Alain

+0

@Alain,正确,因为我附加到日志文件。每个回写都会写入一个新的文件实例,因此我们需要将其附加到文件中。 – Squashman

2

你可以在end.It检查添加

for %%# in ("%LOGFILE%") do (
    if %%~z# equ 0 (
     del /s /q "%LOGFILE%" 
    ) 
) 

如果日志文件的大小为0,如果是删除它。

+0

我在最后添加了它。但是,当我使用不存在的文件类型运行文件时,它仍会创建一个输出文件,其中包含输出文件的路径和“按任意键以继续...”字符串。任何想法如何我可以避免打印这些? – Alain

+2

@alain,因为你正在执行它。不要使用CALL并重定向到日志文件。 – Squashman

2

您可以使用回报for /F命令的能力为1 的ExitCode当被处理的数据,那就是:

(for /F "delims=" %%A in ('dir /b /s "%userInputPath%\*.%FileType%"') do echo %%A) > %LOGFILE% || rem 
if errorlevel 1 del %LOGFILE% 

请注意,此代码是用代替子程序调用。 ..

您可以阅读关于如何在for /F命令中使用ExitCode值的详细说明,地址为this question;寻找退出代码管理

1

还有一个解决方案还找到文件具有隐藏文件属性设置它们由命令忽略

@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

相关问题