Тот же пакетный код успешно выполняется во 2-й попытке, почему не выполняется в 1-й попытке - PullRequest
0 голосов
/ 03 мая 2018
@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 голосов
/ 03 мая 2018

Эта характеристика указывает на то, что при первом выполнении есть переменная, которая не является set, но ее значение используется - обычно в операторе if. Однако выполнение первого раза устанавливает значение для переменной, поэтому при втором запуске синтаксис будет правильным.

Обычно включается команда setlocal сразу после @echo off. Это гарантирует, что после завершения кода любые изменения, внесенные в среду, будут отброшены. В этом случае, поскольку у вас нет команды setlocal, значение переменной будет оставлено для второго запуска.

Проблема с вашим кодом заключается в # 1 FAQ - пожалуйста, найдите delayed expansion с помощью search. Переменная folder не устанавливается при выполнении инструкции if "%YesNo%"=="6", следовательно, в первый раз %folder% не имеет значения НО ему присвоено значение в пределах code block, и оно сохраняет это значение для второго запуска (поскольку selocal для его отмены не существует) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...