Почему подстрока не работает? - PullRequest
2 голосов
/ 16 января 2012

Используя этот командный файл, я хочу заархивировать некоторые * .txt файлы. Каждый * .txt файл в своем собственном zip-файле. К сожалению, это не работает, и я получаю в качестве вывода

ECHO is disabled (OFF).

несколько раз. Вот исходный код:

@echo off
setlocal EnableDelayedExpansion

for %%i in (*.txt) do (
    set filename = %%i
    set filenametrunc = %filename:~0,10%

    7z a -tzip -mx0 %zipname%
    echo %filename% zipped.
)

Я прочитал кое-что о EnableDelayedExpansion и активировал его. Не могу заставить его работать, хотя.

Любая помощь приветствуется.

Ответы [ 3 ]

6 голосов
/ 16 января 2012

Вам нужно использовать SetLocal EnableDelayedExpansion и переносить переменные в !.Кроме того, не ставьте пробелы между именами переменных, равно и значение.

set filename = ... делает переменную с именем %filename % со значением ...
set filename=..... делает переменную с именем %filename% со значением .....

@echo off
setlocal EnableDelayedExpansion

for %%i in (*.txt) do (
    set filename=%%i
    set filenametrunc=!filename:~0,10!

    7z a -tzip -mx0 !zipname!
    echo !filename! zipped.
)

Переменные в % внутри скобок оцениваются все одновременно, что составляет до того, как весь цикл начинает выполнение .Ваш предыдущий код расширил бы все переменные до выполнения оператора set.

4 голосов
/ 16 января 2012

Вам нужно инициализировать переменную zipname и расширить переменную, используя символ ! вместо символа %.

Чтение HELP SET, в частности

Задержка раскрытия переменных среды позволяет использовать другой символ (восклицательный знак) для расширения переменных среды во время выполнения.

и измените свой код на

@echo off
setlocal EnableDelayedExpansion
for %%i in (*.txt) do (
    set zipname=%%i
    7z a -tzip -mx0 !zipname!
    echo !zipname! zipped.
) 
3 голосов
/ 16 января 2012

Отложенное расширение требуется только в цикле, если вам нужен доступ к переменной, которую вы назначаете внутри цикла.Но нет необходимости в вашем случае.

Вам необходимо сначала получить правильный синтаксис 7z.Ваш исходный код пытался поместить все файлы в текущем каталоге в один zip-файл, потому что вы не указали имя файла.Также ваш ZIPNAME не был инициализирован.Вы хотите что-то вроде следующего.

7z a -tzip zipname filename

Я предполагаю, что вы хотите, чтобы имя zip совпадало с исходным именем файла, за исключением префикса .zip вместо .txt.Тогда все, что вам нужно, это модификатор ~ n, который дает базовое имя без префикса.7-Zip автоматически добавит расширение .zip.

for %%i in (*.txt) do 7z a -tzip %%~ni %%i

Если вы хотите, вы можете добавить опцию -mx0, которая не выполняет сжатие.Я не могу представить, почему вы сделали бы это для текстового файла.

for %%i in (*.txt) do 7z a -mx0 -tzip %%~ni %%i

Если вы хотите добавить свое собственное сообщение

for %%i in (*.txt) do (
  7z a -mx0 -tzip %%~ni %%i
  echo %%i zipped into %%~ni.zip
)
...