пакетный файл для шифрования нескольких архивов - PullRequest
0 голосов
/ 07 марта 2011

У меня есть коллекция ZIP-архивов, находящихся в коллекции папок в папке Folder1 \, с более чем одним zip-файлом в папке.

Я хочу создать копию этой структуры папок в другой папке назначения Destination \, но со всеми зашифрованными файлами ZIP.

папки внутри Folder1 \ никогда не вкладываются глубже одной, но было бы неплохо общее решение, повторяющееся в папках.

Я перебрал подстроки, но не могу заставить его работать. Я уверен, что я только на расстоянии в%, но это поставило меня в тупик:

for /D %%S in (.\*) do (
  echo %%S
  set PN=%%S:~2,99%
  echo %PN%
  for %%F in (%%S\*.zip) do (

    echo "%UserProfile%\Desktop\Destination\%PN%\%%~nxF"
    )
  )

%% S возвращает путь в форме ". \ Folder", а "set PN = %% S: ~ 2,99%" должен удалить ". \", Но этого не происходит.

echo $$ S отображает ". \ Folder" (без кавычек), что в порядке
echo% PN% отображает ". \ Folder: ~ 2,99", что не в порядке

У меня все в порядке с разархивированием / заархивированием, это просто путевые имена, которые поставили меня в тупик.

1 Ответ

2 голосов
/ 07 марта 2011

Есть некоторые проблемы с вашим скриптом.

  1. Вы не можете использовать выражения подстроки с переменной цикла.Вам придется сохранить ее значение в переменной окружения (например, SET name=%%S) и извлечь подстроку из этой переменной.

  2. Без включения отложенного расширения переменных вы не сможетеиспользовать переменные окружения внутри командного блока, заключенного в скобки, если переменные инициализируются в этом же блоке.Проблема в том, что команды внутри блока анализируются (и оцениваются переменные) в то же время, когда анализируется родительская команда (FOR в этом случае).Поэтому, скорее всего, у вас всегда будет пустая строка вместо %PN%.

  3. На самом деле вам не нужен PN var.Похоже, вы только что ввели его, чтобы удалить часть имени папки .\.Но вам не нужно использовать маску .\* во внешнем цикле FOR, просто используйте вместо нее *.(Тем не менее, если .\* кажется вам более значимым, вы можете просто использовать %%~nxS там, где вам нужно подставить имя папки.)

Итак, это должно дать вам ожидаемыйвывод:

for /D %%S in (*) do (
  for %%F in ("%%S\*.zip") do (
    echo "%UserProfile%\Desktop\Destination\%%S\%%~nxF"
    )
  )

А если вы настаиваете на использовании маски .\*:

for /D %%S in (.\*) do (
  for %%F in ("%%~nxS\*.zip") do (
    echo "%UserProfile%\Desktop\Destination\%%~nxS\%%~nxF"
    )
  )
...