私は本当にこれを理解しようとしているので、我慢してください、そしてどんな援助にも前もって感謝します。 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
を取得するのに苦労しています。
助けてくれてありがとう。
trim.log
ファイルに必要なファイルパス部分がすでにあるので、以下の両方のスクリプトソリューションに使用して、どちらかが必要に応じて機能することを確認するためにテストできます。
For /f "delims=\ tokens=1-5" %%A IN (trim.log) DO (
robocopy X:\%%~A\%%~B T:\%datefolder%\%%~A\%%~B\ %%~C
)
注: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!
)
私はそれをバッチで動作させることをあきらめ、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%'"
標準 エイリアス Foreach-Objectの場合: '
%
'シンボル、ForEach