我有一个批处理文件: C:\ zzzztemp \ zzzBUG_TEST.cmd
set backup_folder=.\BUG_TEST
echo %backup_folder%\*.*
del %backup_folder%\*.*
pause
......其输出是:
C:\zzzztemp>set backup_folder=.\BUG_TEST
C:\zzzztemp>echo .\BUG_TEST\*.*
.\BUG_TEST\*.*
C:\zzzztemp>del .\BUG_TEST\*.*
C:\zzzztemp\BUG_TEST\*.*, Are you sure (Y/N)? y
C:\zzzztemp>pause
Press any key to continue . . .
到目前为止一切顺利,正如预期的那样。
但是,如果我在指定文件夹变量时意外地有一个标签
set backup_folder=.\BUG_TEST{accidentally had a tab here}
结果:
C:\zzzztemp>set backup_folder=.\BUG_TEST
C:\zzzztemp>echo .\BUG_TEST \*.*
.\BUG_TEST \*.*
C:\zzzztemp>del .\BUG_TEST \*.*
C:\zzzztemp\BUG_TEST\*, Are you sure (Y/N)? y
C:\*.*, Are you sure (Y/N)?
从echo输出中可以看出,这被解释为DEL命令的两个参数,因此在两个文件夹上执行DEL操作两次,其中一个是c:\*.*
如果要用/ Q运行此删除(安静,不需要提示确认删除),他可以清除c:!!!
根目录中的所有文件所以,我想我的问题归结为......
是否有安全的写作方式:
del %backup_folder%\*.*
...如果一个看不见的标签被附加到变量赋值上,我会得到一个运行时错误而不是无意中执行带有两个参数的删除?
答案 0 :(得分:3)
set "backup_folder=.\BUG_TEST" extra chars after last quote are ignored
忽略上述作业中最后一个引号之后的任何字符。在作业中不再有意外的尾随制表符或空格: - )
答案 1 :(得分:1)
编辑:
if not "%backup_folder%"=="" if exist "%backup_folder%\*.*" del "%backup_folder%\*.*"
答案 2 :(得分:0)
@ECHO OFF
SETLOCAL
ECHO test 1 - no stray TAB
set backup_folder=.\BUG_TEST
CALL :check %backup_folder%
IF NOT "%fcheck%"=="%backup_folder%" ECHO Suspect foldername +%backup_folder%+&GOTO :EOF
echo %backup_folder%\*.*
ECHO del %backup_folder%\*.*
ECHO test 2 - deliberate stray TAB
:: generate a TAB character
SET "TAB= "
ECHO testing tab exists:%tab%:exists IF there's a gap between the colons
ECHO show it is a TAB%tab%:the
ECHO show it is a TAB%tab%:colons
ECHO show it is a TAB%tab%:should
ECHO show it is a TAB%tab%:align
set backup_folder=.\BUG_TEST%tab%
CALL :check %backup_folder%
IF NOT "%fcheck%"=="%backup_folder%" ECHO Suspect foldername +%backup_folder%+&GOTO :EOF
echo %backup_folder%\*.*
ECHO del %backup_folder%\*.*
GOTO :eof
:check
SET fcheck=%1
GOTO :eof
嗯 - 不要对它的大小感到震惊 - 大多数是评论,并且测试了两种不同的情况(有和没有TAB
)
不确定剪切和粘贴是否会在此处成功运行 - 标签实际上必须是tab
- 但OP擅长这些 - 可能过于如此......
请注意set "var=value"
语法 - 旨在阻止um - 在分配的值中包含的行末尾隐藏不可见字符...
:check
例程使用分隔符[space] [tab] [;] [,] [=]分配值 - 如果分配的值与原始值相同,则没有分隔符。< / p>