[英]Creating input subfolder structure inside output folder
我有一个批处理脚本,它:
示例代码:
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%
并指定相对源路径(为此,可以使用pushd
和popd
命令)。
例如,当当前工作目录为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=1
和delims=
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.