0

入力ディレクトリ出力ディレクトリがあります。

私の主な目標は、特定の拡張子を持つ入力ディレクトリ内のすべてのファイルを配列に読み取ることです。

次に、出力ディレクトリの下の入力ディレクトリに各ファイルのディレクトリのツリーを作成したいと思います。

例えば:

入力ディレクトリ =C:\Input

出力ディレクトリ =C:\Output

入力ディレクトリ ツリー:

C:\Input\1\first.bat

C:\Input\2\3\second.bat

C:\Input\2\3\4\third.bat

C:\Input\3\1\forth.bat

ファイルとフォルダーが空になった出力ツリーが次のようになることを願っています。

出力ディレクトリ ツリー:

C:\Output\1\

C:\Output\2\3\

C:\Output\2\3\4\

C:\Output\3\1\

次のコードがあります。

ファイルの配列を作成する場合:

    set k=0
    for /f "eol=: delims=" %%F in ('dir /b /s %InputDir%\*.%StandardExtension%') do (
        set /a k+=1  
        set filesArray[!k!]=%%F 
    )
    set n=%k%

各ファイルのディレクトリを作成します。

for /l %%i in (1,1,%n%) do (
    set CurrentFile=!filesArray[%%i]!
    call :CheckAndCreateDirectory %SequencesDir% !CurrentFile! %OutputDir% UpdatedOutputDir
)

最後に、ディレクトリを作成する関数:

:CheckAndCreateDirectory
set IntputDir=%1
set CurrentDir=%~dp2
set OutputDir=%3

set UpdatedOutputDir=!CurrentDir:%IntputDir%=%OutputDir%!
set %4=%UpdatedOutputDir%

if not exist %UpdatedOutputDir% (^
echo. & ^
mkdir %UpdatedOutputDir% & ^
echo.)

問題は次のとおりです。入力(および出力も推測)に「特殊」文字などが含まれていない場合&、コードは機能します。ただし、その場合、ディレクトリ ツリーは作成されません。

作業入力:C:\Input_Dir

入力が機能していません:C:\Input&Dir

何か案は?

4

2 に答える 2

2

私はあなたのためにもっと簡単な解決策があると思います:

xcopy /T c:\input c:\ouptut

いくつかの詳細:

/T フォルダー構造を作成しますが、ファイルはコピーしません。空のフォルダーまたはサブフォルダーを含めないでください。/T /E には、空のフォルダーとサブフォルダーが含まれます。

于 2013-02-14T11:05:47.787 に答える
0

Kaysaxのソリューションは良さそうですが、元の質問に答えるには、
常に遅延拡張を使用してください。
そして、あなたの議論を次のような引用符で囲んでみてください

mkdir "!UpdatedOutputDir!"

重要なのは、遅延拡張はすべての特殊文字を問題なく処理できるということです。

!残っている唯一の問題はループにあります。遅延拡張が発生する直前にFORループパラメータが拡張されるため、ファイルまたはパス名の感嘆符が失われる可能性があるためです。
これを解決するには、さらに多くの努力が必要です。

于 2013-02-14T11:30:05.097 に答える