bat:在for语句中列出空目录,if / else语句?

时间:2013-04-18 16:32:08

标签: if-statement batch-file file-management

我尝试编写一个列出指定文件夹中每个文件名的脚本,并通知用户该文件夹是否为空。到目前为止,我已经:

for /r "O:\Mail\5-Friday" %%d in (*.pdf) do (
    dir /a /b "%%~fd" 2>nul | findstr "^" >nul && echo %%~nd || echo Empty: Friday
)

但我不知道在哪里放置if,else运算符。

有没有办法根据用户输入指定文件夹而不重写每个文件夹的每个功能?所以而不是:

if /i {%ANS%}=={thursday} (goto :thursday)
if /i {%ANS%}=={friday} (goto :friday)
:thursday
    <do stuff>
:friday
    <do the same stuff as thursday, but a different directory>

等,我可以用变量代替路径编写一个函数,将目录分配给变量,并根据需要在代码中轻松添加/删除文件夹?

1 个答案:

答案 0 :(得分:2)

要解决问题的第一部分,“在哪里放置if,else运算符”......

的符号
command | findstr >nul && echo success || echo fail

...是

的简写
command | findstr >nul
if ERRORLEVEL 1 (
    echo fail
) else (
    echo success
)

发生的神奇之处在于conditional execution operators&&||。如果findstr退出状态为零,则会找到匹配项。因此,执行&&之后的内容。否则,状态为非零,未找到匹配项,因此请在||之后执行。看看它是如何工作的?


对于第二部分,这是一种提示用户根据有限数量的选择提供条目的典型方法。

@echo off
setlocal

:begin
set /p "day=What day? "
for %%I in (monday tuesday wednesday thursday friday) do (
    if /i "%day%" equ "%%I" goto %%I
)
goto begin

:monday
call :getdirs "O:\Mail\1-Monday"
goto :EOF

:tuesday
call :getdirs "O:\Mail\2-Tuesday"
goto :EOF

:wednesday
call :getdirs "O:\Mail\3-Wednesday"
goto :EOF

:thursday
call :getdirs "O:\Mail\4-Thursday"
goto :EOF

:friday
call :getdirs "O:\Mail\5-Friday"
goto :EOF

:getdirs <path>
setlocal enabledelayedexpansion
for /f "delims=" %%I in ('dir /b /s /ad "%~1"') do (
    dir /b "%%I" 2>NUL | findstr "^" >NUL || echo %%I has no files
)
goto :EOF

或者,即使是黑客,我会做一些你可能没想到的事情。我将使用脚本open a folder selection dialog来允许用户选择要扫描的目录。它是批处理/ JScript混合脚本。

如果您愿意,可以通过更改倒数第二行中的最后一个参数,将文件夹浏览器的根目录设置为ShellSpecialConstants folder。使用值0x11使根成为系统的驱动器。没有值或0x00的值使根“桌面”。或者按原样保留脚本,将根目录设置为“O:\ Mail”。

@if (@a==@b) @end /*

:: fchooser2.bat
:: batch portion

@echo off
setlocal

set initialDir="O:\Mail"

for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0" "%initialDir%"') do (
    call :getdirs "%%I"
)

exit /b

:getdirs <path>
setlocal enabledelayedexpansion
for /f "delims=" %%I in ('dir /b /s /ad "%~1"') do (
    dir /b "%%I" 2>NUL | findstr "^" >NUL || (

        rem This is where you put code to handle empty directories.
        echo %%I has no files

    )
)
goto :EOF

:: JScript portion */

var shl = new ActiveXObject("Shell.Application");
var hint = 'Double-click a folder to expand, and\nchoose a folder to scan for empty directories';
var folder = shl.BrowseForFolder(0, hint, 0, WSH.Arguments(0));
WSH.Echo(folder ? folder.self.path : '');

编辑由于BrowseForFolder显然接受绝对目录,因此使用PowerShell / C#确实没有任何好处。混合批处理/ PowerShell / C#脚本此后应为retired to the revision history

这很有趣!