Batch file 相同的批处理代码在第二次尝试中成功运行,为什么在第一次尝试中失败
我使用notepad++保存了这段代码 在命令提示符中接收到的输出: 文件名、目录名或卷标语法不正确。 该命令的语法不正确。 创建 文件名、目录名或卷标语法不正确。 Thunderbird的子目录或文件已存在Batch file 相同的批处理代码在第二次尝试中成功运行,为什么在第一次尝试中失败,batch-file,Batch File,我使用notepad++保存了这段代码 在命令提示符中接收到的输出: 文件名、目录名或卷标语法不正确。 该命令的语法不正确。 创建 文件名、目录名或卷标语法不正确。 Thunderbird的子目录或文件已存在 在这里,Thunderbird文件夹是在bat文件存在的地方创建的,但是它应该是在驱动器D的“BackupEmail”文件夹中创建的 当我在同一命令提示符下再次运行它时,它成功运行 该特性表明,在第一次执行时,有一个变量不是set,而是正在使用它的值-通常在if语句中。但是,第一次执行是为
该特性表明,在第一次执行时,有一个变量不是
set
,而是正在使用它的值-通常在if
语句中。但是,第一次执行是为变量建立一个值,因此在第二次运行时,语法是正确的
通常在@echo off
之后立即包含setlocal
命令。这样可以确保在代码完成后,放弃对环境所做的任何更改。在这种情况下,由于没有setlocal
命令,因此变量的值将保留在第二次运行中
代码的问题在于#1常见问题-请使用搜索
工具搜索延迟扩展
。执行if“%YesNo%”==“6”
指令时,变量文件夹
未建立,因此在第一次执行时
%folder%
没有值,但它在代码块中被分配了一个值,并在第二次运行时保留该值(因为没有selocal
来丢弃它).此特征表明,在第一次执行时,有一个变量未设置,但正在使用它的值-通常在if
语句中。但是,第一次执行是为变量建立一个值,因此在第二次运行时,语法是正确的
通常在@echo off
之后立即包含setlocal
命令。这样可以确保在代码完成后,放弃对环境所做的任何更改。在这种情况下,由于没有setlocal
命令,因此变量的值将保留在第二次运行中
代码的问题在于#1常见问题-请使用搜索
工具搜索延迟扩展
。执行if“%YesNo%”==“6”
指令时,变量文件夹
未建立,因此在第一次执行时
%folder%
没有值,但它在代码块中分配了一个值,并在第二次运行时保留该值(因为没有selocal
来丢弃它)。谢谢@Magoo。我已经实现了setlocal,现在可以工作了。谢谢@Magoo。我实现了setlocal,它现在正在工作。
@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