Переменная CMD не меняется - PullRequest
0 голосов
/ 03 июня 2018

Я пишу свой первый маленький сценарий cmd прямо сейчас, но у меня есть проблема.Но обо всем по порядку:

pushd Z:\customScripts
echo %filename%
set /p filename=Enter filename please: && 7za.exe a -tzip Z:\customScripts\"%filename%".zip "%filename%".py license.txt

Я только что запустил cmd, и я только хотел сделать этот скрипт, чтобы помочь мне немного, 7za делает zip-файл из моего указанного файла.

ПримерДело: я открываю новое окно CMD.Когда я запускаю свой код в первый раз, я ввожу "helloWorld" (и в моем каталоге есть файл с именем "helloWorld.py")
. Он создает ZIP-файл с именем "% filename% .zip" и содержит только лицензию.больше ничего.
Но во второй раз, когда я запускаю его (с тем же открытым CMD-окном), не имеет значения, какой у меня ввод, он запоминает определенную переменную% filename% из прошлого раза и создает правильный zipфайл с правильным именем и содержимым ....

Я хочу, чтобы мои входные данные определяли имя zip-файла, и в нем должны были быть заархивированы файл license.txt и сценарий python с моим вводом в качестве имени.
Я сохраняю свой файл как .bat, если это что-то меняет.
Надеюсь, я прояснил свою проблему, и некоторые могут помочь мне!

Снимок экрана

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Похоже, вы попали в тупик двух характеристик партии.

Во-первых, если вы не начнете свою партию с

@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, поэтому я могу легко вернуться к нему и его тестовым файлам.

0 голосов
/ 03 июня 2018

Изменено цитирование и протестировано локально с 7z.exe без проблем.

:: SO_50666890.cmd
@Echo off
Set "BaseFolder=Z:\customScripts\"

Pushd "%BaseFolder%" 
Set "filename="
set /p "filename=Enter filename please: "
if not defined filename exit /B 0
If exist "%filename%.py" (
  7z.exe a -tzip "%BaseFolder%%filename%.zip" "%filename%.py" license.txt
) else (
  Echo file : %filename%.py doesn't exist
)
...