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 回答