连接DOS变量以避免看不见的制表符导致双重执行DEL命令的安全方法?

时间:2013-06-06 23:53:42

标签: batch-file dos

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

...如果一个看不见的标签被附加到变量赋值上,我会得到一个运行时错误而不是无意中执行带有两个参数的删除?

3 个答案:

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