Batch file 批处理:重定向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来比较文件,但希望获取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.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,看看这些是否是可能的途径。更多信息谢谢!