ファイル名からフォルダ名を抽出し、そのフォルダにファイルを移動する BAT ファイル

ファイル名からフォルダ名を抽出し、そのフォルダにファイルを移動する BAT ファイル

私は Windows の bat ファイル プログラミングにあまり詳しくないので、この点についてご助力いただければ幸いです。

以下のことを実行するには bat ファイルが必要です。

  • ファイル名からフォルダー名を抽出します。たとえば、ファイル名「123-Chemistry-101.rep」から Chemistry を抽出します。トークンの開始と終了を示すために「-」を使用できます。
  • 同じファイルを Chemistry というフォルダに移動します。Chemistry はすべてのレポートが保存されているサブディレクトリになります。

おそらく、その 2 番目の部分 (このサイトで見つけたもの) は実行できると思いますが、最初の部分は私のスキルを超えています。

たとえば、/RU:\Test %%f を (*.rep) にコピーする場合は、%%f U:\test\Chemistry\ をコピーします。

よろしく、デュランド

答え1

を要求されましたが、今日ではそのようなタスクには少し時代遅れだと思うので、あなたのシステムが をサポートしていることを願ってBatch、 で回答します:PowershellBatchPowershell

$rootDir = "U:\Test"

$files = Get-ChildItem $rootDir -Filter *.rep

foreach($file in $files) {
  $folder = $file.toString().split("-")[1]
  $sourcefile = "$rootDir\$file"
  $targetdir = "$rootDir\$folder"
  if(!(Test-Path -Path $targetdir )){
    New-Item -ItemType directory -Path $targetdir
  }
  Move-Item $sourcefile $targetdir
}

編集 @Karan:

再帰的(サブディレクトリツリーを保持):

$rootDir = "U:\Test"

$files = Get-ChildItem $rootDir -Filter *.rep -Recurse

foreach($file in $files) {
  $sourcefile = $file.Fullname
  $filepath = $file.PSParentPath
  $newfoldertocreate=$file.toString().split("-")[1]
  if(!(Test-Path -Path $filepath\$newfoldertocreate)){
    New-Item -ItemType directory -Path $filepath\$newfoldertocreate
  }
  Move-Item $sourcefile $filepath\$newfoldertocreate
}

答え2

このバッチファイルを親フォルダから実行しますレポートフォルダ:

for /f "delims=" %%a in ('dir /b /s "Reports folder\*.rep"') do for /f "tokens=2 delims=-" %%i in ("%%~a") do (
    if not exist "%%~dpa%%i\" md "%%~dpa%%i"
    move "%%~a" "%%~dpa%%i\"
)

%%aと%%iは2つの変数で使用されますのためにループします。前者には .REP ファイルへの完全なパスが含まれます (外側のループによります)。後者にはファイル名から抽出されたフォルダー名が含まれます (内側のループによります)。

for /?興味のある人は、さらに詳しいヘルプを得るために、次のものを調べる必要があります (バッチ ファイルでは % 記号が 2 つになっていることに注意してください)。

%~I  - expands %I removing any surrounding quotes (")
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only

では、「%%~dpa%%i」とはどういう意味でしょうか?ディレクトリコマンドは です"C:\Reports folder\123-Chemistry-101.rep"

%%~dpaは、ファイルのドライブ文字とパスから引用符を除いたもの、つまり を意味しますC:\Reports folder\

%%私上で述べたように、これはファイル名から抽出されたフォルダー名 (2 つのハイフン区切り文字の間にあるもの) なので、この場合はChemistry.

すべてをまとめると、このファイルの場合、「%%~dpa%%i」は に展開されます"C:\Reports folder\Chemistry"。これは、ファイルを移動したい場所だからです。

関連情報