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



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

我正在尝试创建一个用于一次删除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:testimagescar.jpg, Delete (Y/N)?

正确:

Enter file name (e.g. car.jpg):plane.jpg
File C:testimagesplane.jpg doesn't exist
Press any key to continue . . .

我想禁止任何通配符。例如以下内容:

Enter file name (e.g. car.jpg):*
C:testimagesbus.jpg, Delete (Y/N)? n
C:testimagescar.jpg, Delete (Y/N)? n
C:testimagestruck.jpg, Delete (Y/N)? n
Press any key to continue . . .

我假设您要禁止输入 *或?的用户。

还有其他无证件的通配符。
@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

可能有更多可靠的方法来检查输入验证。我相信这可能会以某种形式破裂。

这是使用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%中至少存在一张通用卡,则%%BTEST并不为空。_字符被预先预先添加并附加以防万一通牌的方法仅在 %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

最新更新