If statement bat:列出for语句中的空目录、if/else语句?

If statement bat:列出for语句中的空目录、if/else语句?,if-statement,batch-file,file-management,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操作符应该放在哪里 有没有一种方法可以根据用户输入指定一个文件夹,而不必重写每个文件

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

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>
if/i{%ANS%}={星期四}(转到:星期四)
if/i{%ANS%}={friday}(转到:friday)
:星期四
:星期五

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

解决问题的第一部分,“if,else操作符放在哪里”。。。符号

command | findstr >nul && echo success || echo fail
。。。是的缩写

command | findstr >nul
if ERRORLEVEL 1 (
    echo fail
) else (
    echo success
)
发生的神奇之处在于,
&&
|
。如果
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

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


这很有趣

你能把这个问题分成两个问题吗?你能不能直接问
echo%%~nxd
,而不是
dir/a/b“%%~fd”2>null?(我知道这不能回答你的问题,我只是想了解你在做什么。)请告诉我们你为什么决定“列出每个文件名…并通知用户…”。你想在这里完成什么?你得到这些随机建议的原因是因为我们不知道终点线在哪里。如果你一直“重写每个函数”,这应该是一个警告信号,表明你在某个地方做出了错误的决定,但如果你不告诉我们你要去哪里,我们就帮不了你。我要做的是在选择目录后:回显该目录中的每个文件,但如果它是空的,回显“*是空的”@Nate Hekman-
echo%%~nxd
似乎也产生了同样的效果。这和我以前做的一样,只是速记吗?这真是太棒了。解决我的问题的最后一部分,我绝对不会想到这一点。@伊萨洛夫-如果你同意这是合适的,请考虑。尽管我仍在测试和调整这里和那里。:)@Insarov-我想我现在已经完成了对脚本的邪恶实验。你选了你最喜欢的吗?你对这件事有什么问题吗?我很生气,但最后一个问题很有趣。不过,我仍然停留在问题的第一部分。如果目录是空的,我如何让它回显,例如“Friday:empty”?使用
|findstr“^”>nul&&echo%%~nd | echo Empty:Friday
,如果找不到字符串,它将不会执行任何操作。确实会执行。它回声
空:星期五
。我在回答的顶部加了一个解释。另外,请参阅以获取更全面的解释。也许为了安全起见,我们应该给“空”下定义。如果目录没有文件但包含文件夹,那么您认为目录是空的吗?或者只有当它既不包含文件也不包含文件夹时才是空的?
@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 : '');