2011-03-07 71 views
0

我有一個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" 
    ) 
) 

的%%小號返回形式的路徑「 \文件夾」和「設置PN = %% S:〜2 ,99%「應該刪除」。「,但它沒有發生。

呼應$$ S顯示(不帶引號),這是OK
回聲%PN%顯示爲 「\文件夾。」」 \文件夾:2,99" 〜,這是不正常

我好吧,解壓/壓縮,這只是讓我難倒的路徑名稱。

回答

2

您的腳本存在一些問題。

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

Copybook answer @Andrijy。非常感謝。作品一種享受。 – rossmcm 2011-03-07 03:28:39