Похоже, вы попали в тупик двух характеристик партии.
Во-первых, если вы не начнете свою партию с
@echo off
setlocal
, то с любыми значениями, которые вы установили в любом прогоне длялюбой конкретный экземпляр cmd
окна остается установленным для этого экземпляра командного окна.
@echo off
- это просто общая команда запуска, которая превращает вывод команды off
.Отражение команд (когда команда выводится на консоль перед выполнением) - это стандартный режим.Его можно оставить или повернуть on
для целей отладки, но обычно вы не хотите видеть пошаговые инструкции.
Команда setlocal
устанавливает локальную среду (он также имеет другое применение, но, пожалуйста, попробуйте пройти до запуска ...), чтобы любая переменная, которая была добавлена / удалена / изменена в партии, вернулась к своему начальному значению по окончании партии(или команда endlocal
выполнена).Таким образом, вы можете поддерживать чистоту среды, чтобы последовательные пакеты не загромождали среду добавлениями, удалениями и изменениями.
Второй - это экземпляр, связанный с delayed expansion
(существует множество статей SO).по этому вопросу - используйте средство search
).
Пакетный анализ строк исходного кода по логической строке.Логическая строка - это одна физическая строка или несколько физических строк, над которыми в скобках заключена команда или последовательность команд.
Первый шаг в этом анализе - заменить любое значение %var%
фактическим значением . из var
в то время.
Следовательно, ваша
set /p filename=Enter filename please: && 7za.exe a -tzip Z:\customScripts\"%filename%".zip "%filename%".py license.txt
, поскольку она является единственной логической строкой, сначала заменит %filename% (which will be the value established in the *last* run as your code stands) and then execute the
set/ p and if setting the variable is successful then execute the
7a command into which the value of
имя файла` уже подставлено.
Исправлено:
@echo off
setlocal
pushd Z:\customScripts
echo %filename%
set /p filename=Enter filename please:
if defined filename 7za.exe a -tzip Z:\customScripts\"%filename%".zip "%filename%".py license.txt
popd
Другая странная характеристика set /p
заключается в том, что если вы отвечаете просто введите значение в целевой переменной не будет пусто , но не изменено .
Я подозреваю, что это на самом деле часть более крупного сценария, но яМы применили закрывающее значение popd
для полноты.
Дословный тестовый код:
ECHO ------------- START AT %time%
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
pushd %sourcedir%
echo %filename%
set /p filename=Enter filename please:
if defined filename c:\portable\PortableApps\PortableApps.com\App\7-Zip\7za.exe a -tzip %sourcedir%\"%filename%".zip "%filename%".py license.txt
DIR /a-d
POPD
GOTO :EOF
Результаты:
------------- START AT 1:52:17.58
ECHO is off.
Enter filename please: q50666890
7-Zip (A) 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
Scanning
Creating archive U:\sourcedir\q50666890.zip
Compressing license.txt
Compressing q50666890.py
Everything is Ok
Volume in drive U has no label.
Volume Serial Number is C653-9000
Directory of U:\sourcedir
04/06/2018 01:52 141,778 q50666890.py
04/06/2018 01:52 150,829 license.txt
04/06/2018 01:52 64,954 q50666890.zip
, что именноЯ ожидал.
Примечания: - U:\sourcedir
- это мой каталог тестирования
Моя копия 7za
есть
q50666890
- это номер вопроса в SO, поэтому я могу легко вернуться к нему и его тестовым файлам.