我不认为这是一个重复的问题(令我惊讶的是)。我不是使用批处理文件的粉丝,我可以依靠单手创建一次的次数。
我正在尝试创建一个批处理文件,一次删除1个文件,没有通配符。如果文件名不存在,则批处理文件应终止。
我的错误批处理文件:
@echo off
set /p image="Enter file name (e.g. car.jpg):"
set fullFileName=C:\testimages\%image%
IF EXIST "%fullFileName%" (
ECHO[
del /P /F "%fullFileName%"
) ELSE (
ECHO File %fullFileName% doesn't exist
)
pause
正确:
Enter file name (e.g. car.jpg):car.jpg
C:\testimages\car.jpg, Delete (Y/N)?
正确:
Enter file name (e.g. car.jpg):plane.jpg
File C:\testimages\plane.jpg doesn't exist
Press any key to continue . . .
我想禁止任何外卡。如下:
Enter file name (e.g. car.jpg):*
C:\testimages\bus.jpg, Delete (Y/N)? n
C:\testimages\car.jpg, Delete (Y/N)? n
C:\testimages\truck.jpg, Delete (Y/N)? n
Press any key to continue . . .
答案 0 :(得分:2)
我假设您要禁止用户输入*或?。不过还有其他未记载的通配符。
@echo on
:loop
cls
set /p "image=Enter file name (e.g. car.jpg):"
(echo "%image%"|findstr /L "* ? < > ^" >nul 2>&1) && GOTO :EOF
set "fullFileName=C:\testimages\%image%"
IF EXIST "%fullFileName%" (
ECHO[
ECHO del /P /F "%fullFileName%"
) ELSE (
ECHO File "%fullFileName%" doesn't exist
)
endlocal
pause
可能有更强大的方法来检查输入验证。我相信这可能会以某种形式被打破。
答案 1 :(得分:2)
这是使用for /F
命令的选项:
set "image=" & set /P image="Enter file name: "
for /F tokens^=1*^ delims^=?*^<^>^" %%A in ("_%image%_") do set "TEST=%%B"
if defined TEST echo There are wild-cards!
如果%image%
中至少有一张外卡,%%B
因此TEST
不为空。如果通配符仅出现在_
的开头和/或末尾,则会为%image%
字符添加前缀和附加,以防止失败。
这是使用标准for
循环的另一种选择:
set "image=" & set /P image="Enter file name: " & set "FLAG=#"
for %%A in ("%image%") do if /I "%image%"=="%%~nxA" (set "FLAG=") else goto :QUIT
:QUIT
if defined FLAG echo There are wild-cards!
如果%image%
中至少有一张外卡,for
循环通过访问文件系统并返回匹配项(零或更多)来解析它;这意味着原始字符串%image%
不等于任何迭代项,因此if
查询失败; goto
是为了避免任何更多的迭代,从而打破循环;如果没有项匹配,则循环根本不迭代。如果%image%
中不存在通配符,则for
循环仅在原始字符串上迭代一次,从而满足if
条件并清除变量FLAG
。 / p>