繁体   English   中英

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

[英]Creating input subfolder structure inside output folder

我有一个批处理脚本,它:

  1. 从文件夹中读取输入文件
  2. 阐述他们
  3. 将输出文件存储在另一个文件夹中

示例代码:

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下。

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

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

我将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" 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

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

为了避免空格或空格中的任何特殊字符,我在所有路径周围都加上了引号。 我还在set命令行中引用了赋值表达式。

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

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

您可以执行以下操作:

@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字符串的长度。 在此处查看一些解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM