我有一个批处理脚本:
示例代码:
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
。
如何在输出文件夹中重新创建输入子文件夹结构?
答案 0 :(得分:1)
我会将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"
将返回:
.\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=1
和delims=
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。