0

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

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>

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

4

1 回答 1

2

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

command | findstr >nul && echo success || echo fail

... 是简写

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

发生的神奇之处在于条件执行运算&&and ||。如果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

或者,甚至更骇人听闻,我会做一些你可能没想到的事情。我将让脚本打开一个文件夹选择对话框,以允许用户选择要扫描的目录。这是一个批处理/JScript 混合脚本。

如果您愿意,可以通过更改倒数第二行的最后一个参数,将文件夹浏览器的根目录设置为ShellSpecialConstants 文件夹。使用值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# 脚本今后将退出修订历史

这很好玩!

于 2013-04-18T16:50:17.807 回答