1

我有一个批处理文件: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%\*.*

...这样我会得到一个运行时错误,而不是在一个看不见的选项卡被附加到变量赋值的情况下无意执行带有两个参数的删除?

4

3 回答 3

3
set "backup_folder=.\BUG_TEST" extra chars after last quote are ignored

上述赋值中最后一个引号之后的任何字符都将被忽略。作业中不再有意外的尾随制表符或空格 :-)

于 2013-06-07T04:57:41.030 回答
1

编辑:

if not "%backup_folder%"=="" if exist "%backup_folder%\*.*" del "%backup_folder%\*.*"
于 2013-06-07T02:58:50.737 回答
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"语法-旨在阻止嗯-在分配的值中包含行尾的杂散不可见字符...

:check例程使用分隔符 [space][tab][;][,][=] 分配一个值 - 如果分配的值与原始值相同,则没有分隔符。

于 2013-06-07T04:37:13.797 回答