Batch file 批处理:重定向FC输出、解析和声明变量
我试图使用FC来比较文件,但希望获取FC命令的输出,解析它,并声明变量,以便在不匹配的远程文件上复制源文件,基本上同步 我的代码非常简单,因为Batch file 批处理:重定向FC输出、解析和声明变量,batch-file,file-comparison,Batch File,File Comparison,我试图使用FC来比较文件,但希望获取FC命令的输出,解析它,并声明变量,以便在不匹配的远程文件上复制源文件,基本上同步 我的代码非常简单,因为fc做了我需要的一切: @echo off set source=C:\source\ set remote=C:\remote\ fc /b %source%\*.* %remote%\*.* 文件不同时的fc输出示例: 00000000 47 55 00000001 44 48 00000002 55 61 FC: C:\source\test
fc
做了我需要的一切:
@echo off
set source=C:\source\
set remote=C:\remote\
fc /b %source%\*.* %remote%\*.*
文件不同时的fc输出示例:
00000000 47 55
00000001 44 48
00000002 55 61
FC: C:\source\test.txt longer than C:\remote\test.txt
最后一行是我想要的,我想解析出文件路径,并使用它们声明要在中使用的变量
xcopy %sourcefile% %remotefile%
这需要能够解析多个fc文件输出。:
您的脚本可以是(通过一些调试echo
s和copy
命令,由REM
注释)
但是,提供了更高级的选项,包括递归到子文件夹
如果出于任何原因无法使用ROBOCOPY
,则上述脚本将更改如下:
@ECHO OFF
SETLOCAL EnableExtensions
set "sourceMain=C:\source"
set "remoteMain=C:\remote"
call :subFolder "%sourceMain%" "%remoteMain%" "%sourceMain%"
rem traverse source subfolder structure
for /F "delims=" %%g in ('dir /B /S "%source%\" /A:D 2^>NUL') do (
call :subFolder "%sourceMain%" "%remoteMain%" "%%~g"
)
ENDLOCAL
goto :eof
:subFolder
rem adapted original script
set "sourceRoot=%~1"
set "remoteRoot=%~2"
set "source=%~3"
call set "remote=%%source:%sourceRoot%=%remoteRoot%%%" compute target folder
ECHO *** comparing "%source%" vs. "%remote%" ***
rem next command creates target folder if it does not exists yet
MD "%remote%" 2>NUL
for /F "delims=" %%G in ('dir /B "%source%\" /A:-D 2^>NUL') do (
>NUL 2>&1 FC /b "%source%\%%~G" "%remote%\%%~G"
if errorlevel 1 (
echo %%G files differ or remote does not exist
REM copy /B /Y "%source%\%%~G" "%remote%\%%~G"
) else (
echo %%G files match
)
)
goto :eof
请注意,目标文件夹计算方式已从%%g
循环体移动到:子文件夹
子例程中,原因很简单:无需激活。
请注意,
%%G
循环保持不变。:
您的脚本可以是(通过一些调试echo
s和copy
命令,由REM
注释)
但是,提供了更高级的选项,包括递归到子文件夹
如果出于任何原因无法使用ROBOCOPY
,则上述脚本将更改如下:
@ECHO OFF
SETLOCAL EnableExtensions
set "sourceMain=C:\source"
set "remoteMain=C:\remote"
call :subFolder "%sourceMain%" "%remoteMain%" "%sourceMain%"
rem traverse source subfolder structure
for /F "delims=" %%g in ('dir /B /S "%source%\" /A:D 2^>NUL') do (
call :subFolder "%sourceMain%" "%remoteMain%" "%%~g"
)
ENDLOCAL
goto :eof
:subFolder
rem adapted original script
set "sourceRoot=%~1"
set "remoteRoot=%~2"
set "source=%~3"
call set "remote=%%source:%sourceRoot%=%remoteRoot%%%" compute target folder
ECHO *** comparing "%source%" vs. "%remote%" ***
rem next command creates target folder if it does not exists yet
MD "%remote%" 2>NUL
for /F "delims=" %%G in ('dir /B "%source%\" /A:-D 2^>NUL') do (
>NUL 2>&1 FC /b "%source%\%%~G" "%remote%\%%~G"
if errorlevel 1 (
echo %%G files differ or remote does not exist
REM copy /B /Y "%source%\%%~G" "%remote%\%%~G"
) else (
echo %%G files match
)
)
goto :eof
请注意,目标文件夹计算方式已从%%g
循环体移动到:子文件夹
子例程中,原因很简单:无需激活。
请注意,
%%G
循环保持不变。(代表OP发布解决方案)
多亏了ashipfl和JosefZ,我发现机器人技术正是我所需要的。SS64.com有一个非常适合我工作的例子;下面是代码及其ROBOCOPY页面的链接:
@ECHO OFF
SETLOCAL
SET _source=\\FileServ1\e$\users
SET _dest=\\FileServ2\e$\BackupUsers
SET _what=/COPYALL /B /MIR
:: /COPYALL :: COPY ALL file info
:: /B :: copy files in Backup mode.
:: /MIR :: MIRror a directory tree
SET _options=/R:0 /W:0 /LOG:C:\batch\RoboLog.txt /NFL /NDL
:: /R:n :: number of Retries
:: /W:n :: Wait time between retries
:: /LOG :: Output log file
:: /NFL :: No file logging
:: /NDL :: No dir logging
ROBOCOPY %_source% %_dest% %_what% %_options%
(代表OP发布解决方案)
多亏了ashipfl和JosefZ,我发现机器人技术正是我所需要的。SS64.com有一个非常适合我工作的例子;下面是代码及其ROBOCOPY页面的链接:
@ECHO OFF
SETLOCAL
SET _source=\\FileServ1\e$\users
SET _dest=\\FileServ2\e$\BackupUsers
SET _what=/COPYALL /B /MIR
:: /COPYALL :: COPY ALL file info
:: /B :: copy files in Backup mode.
:: /MIR :: MIRror a directory tree
SET _options=/R:0 /W:0 /LOG:C:\batch\RoboLog.txt /NFL /NDL
:: /R:n :: number of Retries
:: /W:n :: Wait time between retries
:: /LOG :: Output log file
:: /NFL :: No file logging
:: /NDL :: No dir logging
ROBOCOPY %_source% %_dest% %_what% %_options%
您知道,如果比较的文件不同但大小相同,则不会有这样的最后一行,因此是否只同步长度更改的文件?如果源文件比相应的远程文件短怎么办?最后一行将被反转(它总是说“长于”,没有“短于”)……还有其他同步的可能性:只能用于复制较新的文件(
/D
)和现有的文件(/U
),或者只复制那些设置了存档属性的文件(/M
)(文件编辑后,系统会立即进行设置);建立高级同步选项…感谢您的洞察力。我不知道如果源代码较短,FC的输出会反转。FC也可以基于二进制、ASCII和/或Unicode进行比较;但前提是它可以打开和读取。我将进一步查看xcopy和robocopy,看看这些是否是可能的途径。更多信息感谢!您知道,如果比较的文件不同,但大小相同,则不会有这样的最后一行,因此是否只同步长度更改的文件?如果源文件比相应的远程文件短,该怎么办?最后一行将颠倒过来(它总是说“长于”,没有“短于”)…还有其他同步的可能性:可用于仅复制较新的文件(/D
)和现有文件(/U
),或仅复制具有存档属性集(/M
)的文件(一旦编辑文件,系统会立即设置此选项);建立高级同步选项…感谢您的洞察力。我不知道如果源代码较短,FC的输出会反转。FC也可以基于二进制、ASCII和/或Unicode进行比较;但前提是它可以打开和读取。我将进一步查看xcopy和robocopy,看看这些是否是可能的途径。更多信息谢谢!