无法批量解析变量

时间:2013-02-10 18:29:06

标签: batch-file copy robocopy

我正在尝试使用robocopy将文件从一个文件夹复制到另一个文件夹,但我不认为源和目标设置正确。真的很感激这方面的帮助。

@echo off
SET PathString = C:\Users\bibhukdas\Documents\New_folder1~C:\Users\bibhukdas\Documents\New_folder
echo ******start**** >>C:\Users\bibhukdas\Documents\New_folder\log.txt
echo ******POINT1**** >>C:\Users\bibhukdas\Documents\New_folder\log.txt
echo "%PathString%" >>C:\Users\bibhukdas\Documents\New_folder\log.txt
for /f "tokens=1,2 delims =~" %%a in("%PathString%") do set Source1=%%a&set  Destination1=%%b
echo ******POINT1**** >>C:\Users\bibhukdas\Documents\New_folder\log.txt
if "%Source1%" == "0" goto NOSOURCE1
robocopy.exe %Source1% %Destination1% *.doc /COPY:DAT /MINAGE:5 /R:1 >>    C:\Users\bibhukdas\Documents\New_folder\log.txt

:NOSOURCE1
echo *****source unavailable******* >>C:\Users\bibhukdas\Documents\New_folder\log.txt
:EXIT

2 个答案:

答案 0 :(得分:0)

您可以轻松添加ECHO命令以查看变量的值。这样你就可以确定他们 是否正确设置了。

无论如何,在发布的脚本中似乎确实存在一些问题。

第一个是这一行:

SET PathString = C:\Users\bibhukdas\Documents\New_folder1~C:\Users\bibhukdas\Documents\New_folder

=的空间非常重要。赋值前的那个变为变量名的一部分和值的另一部分。因此,上面的行基本上创建了一个名为PathString 的变量,即带有尾随空格字符。要解决此问题,请删除两个空格。

另一个是for循环线。 delims选项后跟一个空格,该空格无效并将导致语法错误。再次,只需删除空格。

还有一个不同类型的问题。您没有在source unavailable命令后省略robocopy输出,这意味着尽管文件已被复制,您仍会在日志中获得source unavailable行。通过在GOTO :EXIT行之后添加robocopy命令,可以轻松解决这个问题。但是,您也可以这样做:

if "%Source1%" == "0" (
  echo *****source unavailable******* >>C:\Users\bibhukdas\Documents\New_folder\log.txt
) else (
  robocopy.exe %Source1% %Destination1% *.doc /COPY:DAT /MINAGE:5 /R:1 >>    C:\Users\bibhukdas\Documents\New_folder\log.txt
)

最后,您可以通过减少输出重定向的数量来提高脚本的可维护性。

重定向可以应用于括号中的命令块,如下所示:

(
  command1
  command2
  command3
  ...
) >outputfile

因此,您可以将重定向应用于C:\Users\bibhukdas\Documents\New_folder\log.txt所有需要这种方式的命令:

(
  echo ******start****
  echo ******POINT1****
  echo "%PathString%"
  for /f "tokens=1,2 delims=~" %%a in("%PathString%") do set Source1=%%a&set  Destination1=%%b
  echo ******POINT1****
  if "%Source1%" == "0" (
    echo *****source unavailable*******
  ) else (
    robocopy.exe %Source1% %Destination1% *.doc /COPY:DAT /MINAGE:5 /R:1
  )
) >>C:\Users\bibhukdas\Documents\New_folder\log.txt

但请注意,for循环必须移到块外。这是因为它设置了稍后在同一个块中评估的变量(使用%扩展),这不会按预期工作。这是括号内的一个效果。你可以在这里使用延迟扩展,但在这种特殊情况下,将分配移到块外更容易。

因此,在解决了上述所有问题后,您的脚本可能如下所示:

@echo off
SET PathString=C:\Users\bibhukdas\Documents\New_folder1~C:\Users\bibhukdas\Documents\New_folder
for /f "tokens=1,2 delims=~" %%a in("%PathString%") do set Source1=%%a&set Destination1=%%b
(
  echo ******start****
  echo ******POINT1****
  echo "%PathString%"
  echo ******POINT1****
  if "%Source1%" == "0" (
    echo *****source unavailable*******
  ) else (
    robocopy.exe %Source1% %Destination1% *.doc /COPY:DAT /MINAGE:5 /R:1
  )
) >>C:\Users\bibhukdas\Documents\New_folder\log.txt

答案 1 :(得分:0)

我对您的代码的要点做了一些修改。 我认为现在应该可行了

@echo off
SET "PathString=C:\Users\bibhukdas\Documents\New_folder1,C:\Users\bibhukdas\Documents\New_folder"
set "delim=,"
echo ******start**** 
echo ******POINT1**** 
echo "%PathString%" 
for /f "tokens=1,2 delims=," %%a in (`echo %PathString%`) do (
echo "%%a" 
echo "%%b"
echo ******POINT1**** 
)

让我发布。 :)