在输出文件夹中创建输入子文件夹结构

时间:2016-06-27 13:44:43

标签: windows batch-file cmd

我有一个批处理脚本:

  1. 从文件夹中读取输入文件
  2. 详细说明
  3. 将输出文件存储在另一个文件夹中
  4. 示例代码:

    set pathTmp=D:\a\b\c
    set pathIn=%pathTmp%\in
    set pathOut=%pathTmp%\out
    
    for /f %%i in ('dir /b %pathIn%') do ( 
        java XXX.jar %pathIn%\%%i >> %pathOut%\%%i
    )
    

    现在我想修改它以从pathIn的所有子文件夹中读取文件,并将输出文件放在pathOut下的的相同子文件夹中。< / p>

    示例:如果输入文件位于pathIn\zzz,则输出文件必须位于pathOut\zzz

    如何在输出文件夹中重新创建输入子文件夹结构?

2 个答案:

答案 0 :(得分:1)

我会将xcopy/L开关一起使用(列出要复制的文件)以检索相对路径。为此,您需要先更改目录%pathIn%并指定相对源路径(为此,可以使用命令pushdpopd。)

例如,当前工作目录为D:\a\b\c\in且其内容为......:

D:\a\b\c\in
         |   data.bin
         +---subdir1
         |       sample.txt
         |       sample.xml
         \---subdir2
                 anything.txt

...命令行xcopy /L /I /S /E "." "D:\a\b\c\out"将返回:

.\data.bin
.\subdir1\sample.txt
.\subdir1\sample.xml
.\subdir2\anything.txt
3 File(s)

如您所见,有相对于当前目录的路径。要删除摘要行3 File(s)find ".\"命令行仅用于返回包含.\的行。

所以这是修改过的脚本:

set "pathTmp=D:\a\b\c"
set "pathIn=%pathTmp%\in"
set "pathOut=%pathTmp%\out"

pushd "%pathIn%"
for /F "delims=" %%I in ('xcopy /L /I /S /E "." "%pathOut%" ^| find ".\"') do (
    md "%pathOut%\%%I\.." > nul 2>&1
    java "XXX.jar" "%%I" > "%pathOut%\%%I"
)
popd

此外,我将md "%pathOut%\%%I\.." > nul 2>&1放在java命令行之前,以便提前创建目录,但不确定是否需要此目录。重定向> nul 2>&1可以避免显示任何输出,包括错误消息。

我在所有路径周围加上引号,以避免白色空格或其中的任何特殊字符出现问题。我还引用了set命令行中的赋值表达式。

您需要在"delims="命令行中指定选项字符串for /F,因为默认选项tokens=1delims= TAB SPACE 会在第一个空格处无意中分割您的路径。

请注意,重定向运算符>>表示追加到文件(如果已存在)。要覆盖,请使用>运算符(我使用过)。

答案 1 :(得分:0)

你可以这样做:

@setlocal EnableDelayedExpansion
@echo off
set pathTmp=D:\a\b\c
set pathIn=%pathTmp%\in
set pathOut=%pathTmp%\out

REM set inLength=ADD FUNCTION TO CALCULATE LENGTH OF PATHIN 

for /f %%i in ('dir /b /s %pathIn%') do ( 
    set var=%%i 
    java XXX.jar %%i >> %pathOut%\!var:~%inLength%!
)

这将从绝对路径中删除pathIn目录的长度,只留下相对路径。然后它将相对路径附加到pathOut var

您需要查找或编写一个函数来获取pathIn字符串的长度。查看一些解决方案here