簡體   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