代码之家  ›  专栏  ›  技术社区  ›  Amir

按批处理文件检查复制文件的大小

  •  0
  • Amir  · 技术社区  · 7 年前

    几年前,我的一个朋友写了一个批处理脚本。它工作得很好,但在一次迁移之后,它突然工作得不好了。我们在oracle表单中使用了这段代码。这段代码,将一些文件从源文件复制到目标文件,然后检查所有文件的大小在源文件和目标文件中是否相等,然后让您删除这些文件。

    你能检查一下我为什么会收到这个错误以及我如何解决它吗??

    此代码生成下一个批处理脚本,并以Oracle格式(PL/SQL)编写:

    lv_content0 := 'NET USE Z: '||lv_folder;
    
    lv_content1:= 'md '||lv_path; --- what is the content of .bat
    lv_content2:= 'start "" "'||lv_path||'"';
    --lv_content3:= 'FOR /D %%I in ('|| :CMMT_FIX_MASTER.V_FIX_LOC ||'\*.*) DO move %%I '||lv_path;
    lv_content3:= 'XCOPY /H /D /Y /S /E /V /F '|| :CMMT_FIX_MASTER.V_FIX_LOC ||'\*.* '||lv_path;
    
    --13062012 add exception to move folder to patches folder --------
    lv_content4a:=  '@For /F "tokens=*" %%a IN (' || '''"dir /s /-c "' || :CMMT_FIX_MASTER.V_FIX_LOC || '" | find "bytes" | find /v "free""''' || ') do @Set summaryout1=%%a'; 
    lv_content4b:=  '@For /f "tokens=1,2 delims=)" %%a in ("%summaryout1%") do @set filesout1=%%a&set sizeout1=%%b'; 
    lv_content4c:=  '@Set sizeout1=%sizeout1:bytes=%' ;
    lv_content4d:=  '@Set sizeout1=%sizeout1: =%';
    
    lv_content5a:=  '@For /F "tokens=*" %%a IN ('|| '''"dir /s /-c "' || lv_path || '" | find "bytes" | find /v "free""''' || ') do @Set summaryout2=%%a';
    lv_content5b:=  '@For /f "tokens=1,2 delims=)" %%a in ("%summaryout2%") do @set filesout2=%%a&set sizeout2=%%b';
    lv_content5c:=  '@Set sizeout2=%sizeout2:bytes=%';
    lv_content5d:=  '@Set sizeout2=%sizeout2: =%';
    
    lv_content6:= '@if %sizeout1% == %sizeout2%' || '  ' || 'RD /S  ' || :CMMT_FIX_MASTER.V_FIX_LOC ;
    lv_content7:= '@if not %sizeout1% == %sizeout2%' || '  ' || 'echo Folders are not completely sync..Please check !! ' ;  
    lv_content8:= '@if not %sizeout1% == %sizeout2%' || '  ' || 'pause' ;               
    

    结果如下:

    NET USE Z: \\ABC\
    md \\XXXX\2018\2018-01\10012018\
    start "" "\\XXXX\2018\2018-01\10012018\"
    XCOPY /H /D /Y /S /E /V /F P:\AAAA\19070\*.* \\XXXX\2018\2018-01\10012018\
    
    @For /F "tokens=*" %%a IN ('"dir /s /-c "P:\AAAA\19070" | find "bytes" | find /v "free""') do @Set summaryout1=%%a
    @For /f "tokens=1,2 delims=)" %%a in ("nullummaryout1%") do @set filesout1=%%a&set sizeout1=%%b
    @Set sizeout1=nullizeout1:bytes=%
    @Set sizeout1=nullizeout1: =%
    
    @For /F "tokens=*" %%a IN ('"dir /s /-c "\\XXXX\2018\2018-01\10012018\" | find "bytes" | find /v "free""') do @Set summaryout2=%%a
    @For /f "tokens=1,2 delims=)" %%a in ("nullummaryout2%") do @set filesout2=%%a&set sizeout2=%%b
    @Set sizeout2=nullizeout2:bytes=%
    @Set sizeout2=nullizeout2: =%
    @if nullizeout1% == nullizeout2%  RD /S  P:\AAAA\19070
    @if not nullizeout1% == nullizeout2%  echo Folders are not completely sync..Please check !! 
    @if not nullizeout1% == nullizeout2%  pause
    
    EXIT;
    

    错误:

    2 File(s) copied
    The system cannot find the file nullummaryout1b @Set sizeout1 nullizeout1:bytes @Set sizeout1 nullizeout1: @For /F "tokens=*" %a IN ('"dir /s /-c "\\XXXX\2018\2018-01\10012018\" | find "bytes" | find /v "free""'.
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Magoo    7 年前

    代码非常笨拙,但这只是一个美学问题。

    此代码:

    @Set sizeout1=nullizeout1:bytes=%
    @Set sizeout1=nullizeout1: =%
    

    没有逻辑意义。

    还有这个:

    @if not nullizeout1% == nullizeout2%  echo Folders are not completely sync..Please check !! 
    @if not nullizeout1% == nullizeout2%  pause
    

    同样会产生语法错误。

    请将原始代码与此“迁移”版本进行比较。

    现在-假设 %s 在原来的已被替换为 null 在迁移的版本中。那么,原始版本将更加明智

    @Set sizeout1=%sizeout1:bytes=%
    @Set sizeout1=%sizeout1: =%
    
    @if not %sizeout1% == %sizeout2%  echo Folders are not completely sync..Please check !! 
    @if not %sizeout1% == %sizeout2%  pause
    

    仍然笨拙,但现在有效,并实际做了一些事情。

    所以我得出结论,您的问题是您的迁移机制已经转换 %s 无效的 出于某种原因。

    从那里开始,解决的是你的法庭。

    我不熟悉Oracle表单,但如果要动态生成批处理,则需要找到一种方法来逃避导致 %s 替换为当前值 s (和 s 未定义,因此替换为 无效的 ). 我不知道转义字符是什么,或者作为一个快速而肮脏的解决方案,您是否可以设置 s 到文字 %s .

    如果这只是一个要运行的批处理文件,并且没有更改,则替换每个字符串 无效的 %s 使用文本编辑器并保存结果,然后按名称运行批处理,而不是从Oracle重新生成批处理。

        2
  •  0
  •   Amir    7 年前

    问题是由于使用PUTF而不是PUT导致的。有关更多信息,请参考此问题: enter link description here