批处理文件以加密多个存档

时间:2011-03-07 02:05:12

标签: windows-xp batch-file environment-variables substring

我有一个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以#34;。\ Folder"形式返回一个路径。和"设置PN = %% S:~2,99%"应该删除"。\"但它没有发生。

echo $$ S显示"。\ Folder" (没有引号)哪个好   echo%PN%显示"。\文件夹:~2,99"哪个不行

我可以解压缩/拉链,它只是让我难以理解的路径名。

1 个答案:

答案 0 :(得分:2)

您的脚本存在一些问题。

  1. 您不能将子串表达式与循环变量一起使用。您必须将其值存储到环境变量(如SET name=%%S)并从该变量中提取子字符串。

  2. 如果在同一个块内初始化变量,则不启用变量的延迟扩展,您将无法在括号内的命令块内使用环境变量。问题是,在解析父命令的同时解析块内的命令(并评估vars)(在这种情况下为FOR)。所以很可能你总是会有一个空字符串代替%PN%

  3. 实际上你不需要PN var。好像你只是介绍它来删除文件夹名称的.\部分。但您不必在外部.\*循环中使用FOR掩码,而只需使用*。 (尽管如果.\*似乎更有意义,您只需使用%%~nxS替换文件夹的名称。)

  4. 所以,这应该给你预期的输出:

    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"
        )
      )