5

これが私の状況です。プロジェクトには、一部の添付ファイルを別のシステムに移行することを目的としています。

これらの添付ファイルは親フォルダに配置され、たとえば「」と言います(理解を深めるためにこの質問の図Folder 0を参照してください)。これらの添付ファイルは圧縮/圧縮されます。

バッチスクリプトを次のように呼び出したい:

BatchScript.bat "c:\temp\usd\Folder 0"

7za.exeコマンドライン抽出ツールとして使用しています。

バッチスクリプトで実行したいのは、 " Folder 0"のサブフォルダーを反復処理し、含まれているすべてのZIPファイルをそれぞれのフォルダーに抽出することです。

抽出されたファイルは、それぞれのZIPファイルと同じフォルダーにある必要があります。したがって、「」に含まれるファイルは「File 1.zip」などに必要ですFolder 1

FOR...DOのコマンドについて読みましたWindows XP Professional Product Documentation - Using Batch Files

これが私のスクリプトです:

@ECHO OFF

FOR /D %folder IN (%%rootFolderCmdLnParam) DO 
    FOR %zippedFile IN (*.zip) DO 7za.exe e %zippedFile

ファイル抽出のために7za.exee%zippedFileを呼び出す前に、実際のディレクトリも変更する必要があると思いますが、このバッチファイルでその方法を理解することはできません(コマンドラインでの方法を知っていても、知っていても)同じ命令「cd」です)。

編集#1

ServerFault私はすでに同じ質問に対するいくつかのヒントを受け取りました。このリンクで回答を参照してください。

ただし、パラメータフォルダで指定されたものからではなく、ルート(C:)から抽出されました。

誰かアイデアがありますか?

編集#2

バッチスクリプトは、スペース文字を含むフォルダ名とファイル名を適切に処理していないようです。誰かが私の考えを確認できますか?

編集#3

これが使用されるディレクトリ構造がわからないため、完全に再帰的である必要があります。

編集#4.a

@aphoriaのソリューションで、私はもうすぐそこにいます!唯一の問題は、たとえばFile5.zip、取得するためだけにファイル名を取得し、サブフォルダーをFile5作成してサブフォルダーFile5に抽出するFile5.zip必要があることですFile5。次に、でFile5サブフォルダーを作成Folder 1する必要があります。代わりに、サブフォルダーを作成する必要がありFile1ます。私の例に固執します。 。

編集#4.b

必要に応じて、現在のコードは次のとおりです。

@echo off

setlocal enableextensions enabledelayedexpansion

rem
rem Display instructions when no parameter is given.
rem
if "%1" equ "" (
    echo Syntaxe : od.bat ^<directory mask>^
    echo Exemple : od.bat *
    goto :Eof
)

rem
rem Setting the PATH environment variable for this batch file for accessing 7za.exe.
rem
path=c:\temp;%PATH%

rem
rem Removing quotes from the given command line parameter path.
rem
set root=%1
set root=%root:~%1
set root=%root:~0,-1%

rem Searching directory structure from root for subfolders and zipfiles, then extracting the zipfiles into a subfolder of the same name as the zipfile.
for /F "delims==" %%d in ('dir /ogne /ad /b /s %root%') do (
    echo Traitement du dossier : "%%d"

    for /F "delims==" %%f in ('dir /b "%%d\*.zip"') do (
        rem Getting filename without extension.
        set subfolder=~n%f
        mkdir "%%d\%subfolder%"
        rem Extracting zipfile content to the newly created folder.
        7za.exe e "%%d\%%f" -o"%%d\%subfolder%"
    )
)

:Eof

endlocal

アイデアは誰ですか?

私の推測では、一度に1つのディレクトリ階層を掘り下げます。これが取引です。Folder Ain Folder 1(Folder 1 \ Folder A)があるとすると、それはから検索しFolder 1Folder 5に戻りFolder 1\Folder Aます。ここで、%subfolder%変数は最後の値を保持します。

皆様のご協力に感謝申し上げます。

4

1 に答える 1

8

私は7zipコマンドラインオプションにあまり詳しくないので、そのための正確なコマンドを理解する必要がありますが、以下のスクリプトは完全に指定されたパス(スペースが許可されています)を取り、フォルダー名とを出力します。その中に含まれるzipファイル。

@ECHO OFF

REM
REM Remove the double quotes from the front and end of the root path
REM
SET ROOT=%1
SET ROOT=%ROOT:~1%
SET ROOT=%ROOT:~0,-1%
ECHO %ROOT%

FOR /F "DELIMS==" %%d in ('DIR "%ROOT%" /AD /B') DO ( 
  ECHO %%d
  FOR /F "DELIMS==" %%f in ('DIR "%ROOT%\%%d\*.zip" /B') DO (
    ECHO   %%f
  )
)  


次のように実行します。

MyScript.CMD "c:\temp\usd\Folder 0"

次のような出力が得られるはずです。

Folder A
  File 1.zip
  File 2.zip
Folder B
  File 1.zip
  File 2.zip  


アップデート

Folder A\File 1.zip以下のコードは、新しいフォルダに抽出されますFolder A\File 1

覚えておくべきいくつかのこと:

  1. 最初のループでは、名前にスペースが含まれるフォルダーを処理するために、二重引用符で囲むFOR必要があります。%ROOT%
  2. SET2番目の変数の中に変数を入れているので、最初FORに置く必要がありますSETLOCAL ENABLEDELAYEDEXPANSION。次に、!を使用して変数を参照します。(たとえば!subfolder!)実行時に強制的に拡張します。
  3. コードのこの行は次のset subfolder=~n%fようになりますset subfolder=%%~nf
  4. テストするコマンドとコマンドECHOの前に置きます。希望どおりの動作をしていることを確認したら、ステートメントを削除します。 MKDIR7za.exeECHO

コードは次のとおりです。

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

REM
REM Remove the double quotes from the front and end of the root path
REM
SET ROOT=%1
SET ROOT=%ROOT:~1%
SET ROOT=%ROOT:~0,-1%
ECHO %ROOT%

REM Searching directory structure from root for subfolders and zipfiles,
REM then extracting the zipfiles into a subfolder of the same name as the zipfile.

FOR /F "delims==" %%d IN ('dir /ogne /ad /b /s "%ROOT%"') DO (
    ECHO Traitement du dossier : "%%d"

    FOR /F "delims==" %%f IN ('dir /b "%%d\*.zip"') DO (
        REM Getting filename without extension.
        SET subfolder=%%~nf
        ECHO mkdir "%%d\!subfolder!"
        REM Extracting zipfile content to the newly created folder.
        ECHO 7za.exe e "%%d\%%f" -o"%%d\!subfolder!"
    )
)

ENDLOCAL
于 2010-06-09T14:00:12.303 に答える