2017-09-26 51 views
0

我有一個這樣的文件/目錄結構:的Windows批處理文件,其曾祖目錄中複製文件添加爲前綴爲filename

C:\Results\name1\run\string1\output.csv 
C:\Results\name2\run\string2\output.csv 
C:\Results\name3\run\string3\output.csv 
... 

我想複製每個output.csvC:\Results其巨大-grandparent目錄名稱作爲前綴添加到文件,所以我有這樣的:

C:\Results\name1output.csv 
C:\Results\name2output.csv 
C:\Results\name3output.csv 

我嘗試使用批處理代碼貼在下面,但它不能令人信服。
(我試圖從其他網上搜索湊齊了這一點。)

@echo off 
setlocal enabledelayedexpansion 

for /f "tokens=*" %%a in ('dir /A:D /S /B "C:\Results*"') do (
    for %%y in ("%%a\*.csv") do (
     call :GETPARENTPARENT "%%y" ret 

     echo ret=!ret! 
     move /Y "%%y" "!ret!" 
     pause 
    ) 
) 

goto :EOF 

:GETPARENTPARENT 
set fileP=%1 
echo received=%fileP% 
for %%a in (%fileP%) do (
    set parent=%%~dpa 
    cd !parent!\..\.. 
    for /r %%a in (*.csv) do for %%b in ("%%~dpa\.") 

    do ren "%%~a" "%%~nxb%%~xa" 
    set gparent=%%~dpa 
    cd !gparent!\.. 
    set PPPath=!cd! 
    for %%x in ("!PPPath!") do (
     set "%~2=%%~dpnx" 
    ) 
) 
goto :EOF 
+1

Cmd.exe shell腳本(批處理文件)與DOS沒有任何關係。 –

+0

「不完全在那裏」是什麼意思?你的代碼崩潰了嗎? (因爲'do'必須與'for'在同一條物理線上),或者根本不按預期工作(這可能與您嘗試使用* same * metavariable嵌套兩個for語句有關, %a') – Magoo

+0

[DOS和cmd不同](https://superuser.com/q/451432/241386)。除非腳本應該在DOS下運行,否則不應該標記DOS –

回答

0

我認爲這會工作(刪除「回聲」當你確定):

@echo off 
setlocal enabledelayedexpansion 

set baseFolder=C:\Results 

cd /D %baseFolder% 

for /D %%D in (*) do (
    for /f "tokens=* delims=" %%A in ('dir /S /B "*.csv"') do (
     set "filename=%%~nxA" 
     for /f "tokens=3 delims=\" %%G in ("%%A") do set "newname=%baseFolder%\%%G!filename!" 

     echo move /Y "%%A" "!newname!" 
     pause 
    ) 
) 

但如果有多個子文件夾,它會更好,添加更多的文件名稱,以便它們是唯一的:

@echo off 
setlocal enabledelayedexpansion 

set baseFolder=C:\Results 

cd /D %baseFolder% 

for /D %%D in (*) do (
    for /f "tokens=* delims=" %%A in ('dir /S /B "*.csv"') do (
     set "filename=%%~nxA" 
     for /f "tokens=3,4,5 delims=\" %%G in ("%%A") do set "newname=%baseFolder%\%%G%%H%%I!filename!" 

     echo move /Y "%%A" "!newname!" 
     pause 
    ) 
) 
0

看來想要找到剛剛*.csv文件和copy(但您的腳本使用move,如果是這樣,只需將copy替換爲move即可。

1命令行和只是搜索磁盤一旦

msr -l -rp C:\Results -f "\.csv$" -PAC | msr -it "(.*?Results\\[^\\]+).*?([^\\]+)$" -o "copy $0 $1$2" -X

上述命令行:查找*.csv文件遞歸,然後生成複製命令行和執行(-X

  • 刪除-X如果你只是想預覽命令行
  • -PAC(如-X -PAC-XPAC-P -A -C -X等)隱藏其他信息。

msr.exe是文件/管材/文本處理在我打開的項目(查找/替換)https://github.com/qualiu/msrtools目錄,具有跨平臺的版本,一個單一的EXE(約1.6MB,不存在依賴關係)。像內置使用的文檔:https://qualiu.github.io/msr/usage-by-running/msr-Windows.html

相關問題