2017-09-26 12 views
0

をfilenameに接頭辞として追加私はこのようなファイル/ディレクトリ構造を持っている:、Windowsのバッチファイルが

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

私はその偉大でC:\Resultsに各output.csvをコピーしたいのですが-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シェルスクリプト(バッチファイル)は、DOSとは何の関係もありません。 –

+0

「あまりない」とはどういう意味ですか?コードがクラッシュしますか? ( 'do'は' for'と同じ物理行になければなりません)、または期待どおりに動作しないようにする必要があります(同じ*メタ変数を使用する2つの '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を使用する場合は、上記のcopymoveに置き換えてください。

1コマンドラインとだけ一度ディスクを検索:

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

上記のコマンドライン:(-X)copyコマンドラインを生成し、実行し、再帰的に*.csvファイルを探す

  • のプレビューコマンドラインだけの場合は、-Xを削除してください。
  • -PAC-X -PACまたは-XPACまたは-P -A -C -Xなど)を追加すると、他の情報を非表示にすることができます。

msr.exeクロスプラットフォームのバージョンで、私の開いているプロジェクトhttps://github.com/qualiu/msrtoolsディレクトリに(検索/置換)ファイル/パイプ/テキスト処理のために(1.6メガバイト、依存関係のない程度)、単一のexeファイルです。ビルトイン使用のような文書:https://qualiu.github.io/msr/usage-by-running/msr-Windows.html

関連する問題