2016-11-02 3 views
0

MP4ファイルのサブフォルダを含むフォルダがあります。私は実行時にMP4ファイルをサブフォルダからルートフォルダに移動するスクリプトを作成しようとしています。私が書いたバッチファイルは動作していますが、バッチスクリプトが新しいサブフォルダのために再び実行されると、すでにルートフォルダにコピーされていたMP4ファイルがファイル構造の別のレベルに移動します。例:スクリプトが実行されるとサブフォルダからルートディレクトリにファイルを移動しましたが、再度実行したときに次のディレクトリにコピーしません

C:\MainRoot\Root\Subfolder\media.mp4 

は、 'media.mp4は' Cまで移動します:\ルート\のmedia.mp4希望として。 しかし、スケジュールされたタスクを実行するにはスクリプトが必要です。代わりに、Cでの滞在だけでMP4ファイルの

C:\MainRoot\media.mp4 

:\ MainRoot \ルートスクリプトが実行される次回は、私は次の取得します。 ここに私のバッチファイルはMP4ファイルをコピーするために、これまでです:

set root_folder=C:\MainRoot\Root 
for /f "tokens=1* delims=" %%G in ('dir %root_folder% /b /o:-n /s ^| findstr /i ".mp4" ') do (
move /y "%%G" "%%~dpG..\%%~nxG" 
) 

私はので、一度移動し、MP4ファイルの場所に滞在する修正するには何が必要ですか?

ご協力いただければ幸いです!

答えて

0

すべてのソースファイルが特定のディレクトリレベルであるように見えるので、for /Dループは非再帰的dirコマンドライン(無/S)の出力を解析し、あなたのfor /Fループ、巻き付けすることができます

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_ROOT=C:\MainRoot\Root" 
set "_PATTERN=*.mp4" 

rem // Loop through sub-directories: 
for /D %%D in ("%_ROOT%\*") do (
    rem // Loop through matching files: 
    for /F "eol=| delims=" %%F in ('dir /B "%%~fD\%_PATTERN%"') do (
     rem // Avoid overwriting destination file: 
     if not exist "%_ROOT%\%%~nxF" (
      rem // Move matching file one level up: 
      move /Y "%%~fD\%%~nxF" "%_ROOT%\%%~nxF" 
     ) 
    ) 
) 

endlocal 
exit /B 
+0

こんにちは!ありがとう、これを実行しようとすると何も起こりません。私はちょうど別のコマンドラインのプロンプトを取得し、ファイルは移動されません...任意のアイデア?私はそれをコピーし、それを貼り付けて、単にルートフォルダの定数を変更します..どんな助けも大歓迎です! – bbs71364

+0

申し訳ありませんが、私は間違ってファイルを参照して、愚かな私;私は今それを修正 - 参照してください私の[編集](http://stackoverflow.com/revisions/40389031/2)... – aschipfl

+0

ありがとうございました! – bbs71364

0

あなたが提供した例のように上書きするために満足している場合、このような単純なものは、あなたの目的に合うことがあります。

@Echo Off 
Set root_folder=C:\MainRoot\Root 
If /I NOT "%CD%"=="%root_folder%" PushD "%root_folder%" 2>Nul||Exit/B 
For /R %%G In (*.mp4) Do If /I NOT "%~dpG"=="%root_folder%\" Move "%%G">Nul 2>&1 
をファイルが1つのフォルダのみであれば

深いあなたはこれを好むことがあります。

@Echo Off 
Set root_folder=C:\MainRoot\Root 
If /I NOT "%CD%"=="%root_folder%" PushD "%root_folder%" 2>Nul||Exit/B 
For /D %%G In (*) Do Move "%%G\*.mp4">Nul 2>&1 
関連する問題