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

时间:2018-01-10 04:35:10

标签: batch-file plsql oracle11g windows-10

几年前,我的一位朋友写了一个批处理脚本。它工作正常,但在迁移后突然间,它运行不正常。我们在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 个答案:

答案 0 :(得分:1)

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

此代码:

@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转换为null

从那里,修复就是你的法庭。

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

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

答案 1 :(得分:0)

问题是由于使用PUTF而不是PUT。请参阅此问题以获取更多信息: enter link description here