web-dev-qa-db-ja.com

ログファイルからファイルパスとファイル名を抽出するためのバッチファイル

私は本当にこれを理解しようとしているので、我慢してください、そしてどんな援助にも前もって感謝します。 FOR /F "Delims"と "Tokens"の適切な使用法を理解するのにまだ苦労しています。

編集:最終的に私がする必要がある/したいのは、ログファイルにフラグ*EXTRA FileまたはNewerを含む行で、ファイルパスとファイル名を抽出し、ROBOCOPYを使用してそれらのファイルを別のファイルにコピーしますドライブ、コピーされたファイルが日付と時刻がスタンプされたフォルダの下に移動します。

次のようなrobocopyログファイルの出力があります。

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows                              
-------------------------------------------------------------------------------

  Started : Friday, March 27, 2020 6:04:32 AM
   Source : P:\PC_BACKUP\
     Dest : X:\PC_BACKUP\

    Files : *.*

  Options : *.* /TS /FP /TEE /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /NP /MT:1 /R:2 /W:10 

------------------------------------------------------------------------------

      *EXTRA File         11.2 g 2020/03/25 06:09:27    X:\PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-09-09.mrimg
      *EXTRA File         29.7 g 2020/03/26 07:33:31    X:\PC_BACKUP\DellJordan\DC0297C23493575B-10-10.mrimg
      *EXTRA File         27.8 g 2020/03/26 05:10:12    X:\PC_BACKUP\P650HSG\677CFE5FA9EB27B1-10-10.mrimg
        Newer             15.2 g 2020/03/27 06:36:52    P:\PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-10-10.mrimg
        New File           2.2 g 2020/03/27 06:41:31    P:\PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-19-19.mrimg
        Newer             31.1 g 2020/03/27 07:36:04    P:\PC_BACKUP\DellJordan\DC0297C23493575B-11-11.mrimg
        New File           4.4 g 2020/03/27 07:44:55    P:\PC_BACKUP\DellJordan\DC0297C23493575B-23-23.mrimg
        Newer             27.8 g 2020/03/27 05:07:37    P:\PC_BACKUP\P650HSG\677CFE5FA9EB27B1-11-11.mrimg
        New File           1.8 g 2020/03/27 05:09:25    P:\PC_BACKUP\P650HSG\677CFE5FA9EB27B1-22-22.mrimg

------------------------------------------------------------------------------

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         6         6         6         0         0         0
   Files :        74         6        68         0         0         3
   Bytes :   2.266 t  82.830 g   2.185 t         0         0  68.862 g
   Times :   0:16:49   0:04:12                       0:00:00   0:04:12


   Speed :           352546983 Bytes/sec.
   Speed :           20172.900 MegaBytes/min.
   Ended : Friday, March 27, 2020 6:12:56 AM

以下を使用して、ログにエクスポートされた、操作するファイル(「新しい」パスと「* EXTRAファイル」パス)のパスとファイル名だけにこのファイルを切り詰めることができました。

set logname=%~1
findstr /L /G:extractnewer.txt %logname%.log > extract.log
findstr /L /G:extractextrafile.txt %logname%.log >> extract.log

setlocal DisableDelayedExpansion
for /f "tokens=1* delims=\" %%A in (extract.log) do echo %%B >> trim.log

これを行うにはおそらくもっと良い方法がありますが、これまでのところうまくいきます。したがって、そこからのtrim.log出力は次のようになります。

PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-10-10.mrimg 
PC_BACKUP\DellJordan\DC0297C23493575B-11-11.mrimg 
PC_BACKUP\P650HSG\677CFE5FA9EB27B1-11-11.mrimg 
PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-09-09.mrimg 
PC_BACKUP\DellJordan\DC0297C23493575B-10-10.mrimg 
PC_BACKUP\P650HSG\677CFE5FA9EB27B1-10-10.mrimg 

最終的には、ファイルパスとファイル名を分離して、それらを使用してrobocopyファイルのコピーを実行できるようにする必要があります。たとえば、trim.logの各行を通過します。

filepath=PC_BACKUP\P650HSG\
filename=677CFE5FA9EB27B1-11-11.mrimg

だから私はできる:

robocopy X:\%filepath% T:\%datefolder%\%filepath%\ %filename%

しかし、パスとファイルを別々に抽出するための適切なFOR /Fを取得するのに苦労しています。

助けてくれてありがとう。

2
HTWingNut

trim.logファイルに必要なファイルパス部分がすでにあるので、以下の両方のスクリプトソリューションに使用して、どちらかが必要に応じて機能することを確認するためにテストできます。

1.バッチスクリプト

For /f "delims=\ tokens=1-5" %%A IN (trim.log) DO (
    robocopy X:\%%~A\%%~B T:\%datefolder%\%%~A\%%~B\ %%~C
    )

2.バッチスクリプト

注:Setlocal EnableDelayedExpansionは、適切に使用されるように、ループに設定された変数の展開を処理するのに役立ちます実行時に解析されません。

Setlocal EnableDelayedExpansion
For /f "delims=\ tokens=1-5" %%A IN (trim.log) DO (
    SET "filepath=%%~A\%%~B"
    SET "filename=%%~C"
    robocopy X:\!filepath! T:\%datefolder%\!filepath!\ !filename!
    )

3.PowerShellヘルパーを使用したバッチ

私はそれをバッチで動作させることをあきらめ、Robocopy引数値に応じてファイルパスとファイル名の部分を連結するのに役立つ単純なPowerShellヘルパーを追加しました。

これは引き続きバッチファイルとして実行されます。trim.logへのフルパスとファイル名が変数に設定され、datefolder変数値がロジックの前に設定されていることを確認する必要があります。それらの両方の下で実行されるので、適切な順序を確保するために、それに応じて既存のスクリプトに適合します。

SET "tFile=C:\Folder\Path\trim.log"
SET "datefolder=20200328"

SET PSScript=%temp%\PS~TrimTemp.ps1
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"

ECHO Get-Content "%tFile%" ^| %%{                                       > "%PSScript%"
ECHO     $path  = (Split-Path "\$_" -Parent);                           >> "%PSScript%"
ECHO     $path  = (($path.split("\")[1..999]) -join "\");               >> "%PSScript%"
ECHO     $fname = ($_.Split("\")[-1]).Trim();                           >> "%PSScript%"
ECHO     If($path){Robocopy "X:\$path" "T:\%datefolder%\$path" $fname } >> "%PSScript%"
ECHO     };                                                             >> "%PSScript%"

SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'"

その他のリソース

2
Pimp Juice IT