出力とエラーを 1 つのファイルにリダイレクトしてから、 usingコマンド>logfile.txt 2>&1
を後処理します。logfile.txt
for /F
@ECHO OFF >NUL
@SETLOCAL enableextensions disabledelayedexpansion
set "source=d:\bat\*.txt"
set "target=d:\xxx\ddd"
xcopy "%source%" "%target%" /i /s /e /y /c>%temp%\xcopyall.txt 2>&1
set /A "goodfiles=-1"
set /A "bad_files=0"
set "filename=%source:~0,2%"
set "errdescr=%filename%"
for /f "tokens=* delims=)(" %%G in ('type "%temp%\xcopyall.txt"') do (
set "errdescr=%%G"
call :posterr
)
echo %bad_files% File[s] not copied
:::: %goodfiles% File[s] copied
@ENDLOCAL
goto :eof
:posterr
set "errdescr=%errdescr:(=[%"
set "errdescr=%errdescr:)=]%"
rem previous line == a filename?
if /i "%filename:~0,2%"=="%source:~0,2%" (
rem current line == a filename?
if /i "%errdescr:~0,2%"=="%source:~0,2%" (
set /A "goodfiles+=1"
) else (
rem rem current line == 'nnn File[s] copied'?
if /i "%errdescr:File[s] copied=%"=="%errdescr%" (
set /A "bad_files+=1"
echo %filename:&=^&% %errdescr:&=^&%
) else (
set /A "goodfiles+=1"
)
)
)
set "filename=%errdescr%"
goto :eof
固定:
- ログファイルの末尾、つまり
nnn File(s) copied
テキスト
"d:"
動的に置き換えられたリテラル値"%source:~0,2%"
- テスト ロジックが改善された (コピーされていない) 両方のアイテムの補助カウンター (コード内のコメントを参照)
!
、%
、&
(出力を参照)を含むファイル名についてテストされました。
スクリプトはまだ不十分に見えるかもしれませんが、より複雑なシナリオが考えられるようにスクリプトを改良することができます (ターゲット側でのみアクセス拒否エラーについてテストされています)。
出力:
d:\bat>vbserr2
D:\bat\CPs2\unicMacCE.txt Access denied
D:\bat\files\11per%cent.txt Access denied
D:\bat\files\12per%cent%.txt Access denied
D:\bat\files\13per%OS%cent.txt Access denied
D:\bat\files\14per%%OS%%cent.txt Access denied
D:\bat\files\15per%3cent.txt Access denied
D:\bat\files\16per%%3cent.txt Access denied
D:\bat\files\17per%Gcent.txt Access denied
D:\bat\files\18per%%Gcent.txt Access denied
D:\bat\files\1exclam!ation.txt Access denied
D:\bat\files\21ampers&nd.txt Access denied
D:\bat\files\22ampers&&nd.txt Access denied
D:\bat\files\2exc!lam!ation.txt Access denied
D:\bat\files\rand.txt Access denied
14 File[s] not copied
ただし、Xcopy
すでに廃止されています (ただし、現在はまだ使用可能です)。Robocopy
代わりに他のツール ( など) を使用してください。