[英]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.