Windows批处理文件 - 使用Y / N提示删除,不允许使用通配符

时间:2016-12-19 18:36:04

标签: batch-file

我不认为这是一个重复的问题(令我惊讶的是)。我不是使用批处理文件的粉丝,我可以依靠单手创建一次的次数。

我正在尝试创建一个批处理文件,一次删除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 . . .

2 个答案:

答案 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>