我有一个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"哪个不行
我可以解压缩/拉链,它只是让我难以理解的路径名。
答案 0 :(得分:2)
您的脚本存在一些问题。
您不能将子串表达式与循环变量一起使用。您必须将其值存储到环境变量(如SET name=%%S
)并从该变量中提取子字符串。
如果在同一个块内初始化变量,则不启用变量的延迟扩展,您将无法在括号内的命令块内使用环境变量。问题是,在解析父命令的同时解析块内的命令(并评估vars)(在这种情况下为FOR
)。所以很可能你总是会有一个空字符串代替%PN%
。
实际上你不需要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"
)
)