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


@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:UsersusernameAppDataRoamingThunderbird*" "%backupdir%%folder%Thunderbird"
echo Backup Completed!
echo "Deleting Temp files".
del /s /f /q  WindowsTemp*.*
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

我使用记事本++来保存此代码

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

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

  1. 在这里,Thunderbird文件夹是在蝙蝠文件存在的地方创建的,但是它应该在驱动器D的"备份电子邮件"文件夹中创建。
  2. 当我在同一命令提示符下再次运行它时,它成功运行

这个特征表明,在第一次执行时,有一个变量没有被set,但它的值被使用了——通常在if语句中。但是,第一次执行是为变量建立值,因此在第二次运行时,语法是正确的。

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

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

最新更新