第二次尝试成功运行相同的批次代码,为什么第一次尝试失败

时间:2018-05-03 12:47:11

标签: batch-file

@echo off
Call :YesNoBox "Press yes or no"

if "%YesNo%"=="6" (

set backupdir=D:\BackupEmail\
cd /d %backupdir%

set folder=%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%

mkdir %folder%

echo %folder% created

cd /d %folder%

mkdir Thunderbird

cd Thunderbird

set backupcmd=xcopy /s/h/i/c/k/e/r/y

echo ### Backing Up ... 

%backupcmd% "C:\Users\username\AppData\Roaming\Thunderbird\*" "%backupdir%\%folder%\Thunderbird\"

echo Backup Completed!

echo "Deleting Temp files".
del /s /f /q  \Windows\Temp\*.*

cmd /k 
)
exit

:: Design for pop up window
exit /b
:YesNoBox
REM returns 6 = Yes, 7 = No. Type=4 = Yes/No
set YesNo=
set MsgType=4
set heading=%~2
set message=%~1
echo wscript.echo msgbox(WScript.Arguments(0),%MsgType%,WScript.Arguments(1)) >"%temp%\input.vbs"
for /f "tokens=* delims=" %%a in ('cscript //nologo "%temp%\input.vbs" "%message%" "%heading%"') do set YesNo=%%a
exit /b

:MessageBox
set heading=%~2
set message=%~1
echo msgbox WScript.Arguments(0),0,WScript.Arguments(1) >"%temp%\input.vbs"
cscript //nologo "%temp%\input.vbs" "%message%" "%heading%"
exit /b

我用notepad ++来保存这段代码

在命令提示符下收到的输出:

文件名,目录名或卷标语法不正确。 该命令的语法不正确。  创建 文件名,目录名或卷标语法不正确。 一个子目录或文件Thunderbird已经存在。

  1. 这里创建Thunderbird文件夹,其中bat文件存在,但它应该在" BackupEmail"中创建。驱动器D中的文件夹。
  2. 当我在同一命令提示符上再次运行它时,它成功运行

1 个答案:

答案 0 :(得分:2)

这个特性表明,在第一次执行时,有一个变量不是set但是正在使用它的值 - 通常在if语句中。但是,第一次执行是为变量建立一个值,所以在第二次运行时,语法是正确的。

习惯上在setlocal之后立即包含@echo off命令。这可确保在代码完成时,将丢弃对环境所做的任何更改。在这种情况下,由于您没有setlocal命令,因此第二次运行时变量的值保留

您的代码存在问题#1常见问题解答 - 请使用delayed expansion工具搜索search。执行folder指令时未建立变量if "%YesNo%"=="6",因此第一次 %folder%没有值但是 已分配 code block内的值,并且它会保留第二次运行的值(因为没有{ {1}}丢弃它。)