为了解决您问题的第一部分,“在哪里放置 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# 脚本今后将退出修订历史。
这很好玩!