批处理文件循环中的多个命令和变量

时间:2015-03-05 13:33:06

标签: batch-file

我浏览了所有之前提出的类似问题,但无法找到答案。

我有一个批处理文件,用于创建包含特定文本的新批处理文件,文本取自特定目录。它运行良好,但现在很多代码重复多次,应该是自动化的。

这是我的工作代码:

set /p x=<"path were all the source files are kept\FileOne.txt"
set x=%x:~20%
set y="C:\Program Files\TightVNC\tvnviewer" -password=zzz %x%
break> FileOne.bat
echo %y% >>FileOne.bat

第一行打开一个特定目录,打开一个文本文件并将其第一行保存为x。

第二个然后从中删除前20个符号,只留下所需的部分。

第三行将Y设置为新创建的批处理文件中我需要的命令,并将X放在其末尾。

然后Y被保存为输出.bat文件。

对于FileTwo,FileThree,FIleFour等,此代码会一再重复。

以下是我尝试将其转换为循环的方式:

etlocal enabledelayedexpansion

FOR %%A in (FileOne FileTwo) DO (

set /p x=<"path were all the source files are kept\%%A.txt"
set x=%x:~20%
set y="C:\Program Files\TightVNC\tvnviewer" -password=zzz %x%
break> %%A.bat
echo %y% >>%%A.bat

)

这两个文件是按计划创建的,但它们都在Echo is Off里面(或者,当我打开它时,Echo is On)。

这是控制台输出:

C:\>setlocal enabledelayedexpansion

C:\>FOR %A in (FileOne FileTwo) DO (
set /p x= 0<"path were all the source files are kept\%A.txt"
 set x=~20
 set y="C:\Program Files\TightVNC\tvnviewer" -password=zzz %x%
 break1>%A.bat
 echo   1>>%A.bat
)

C:\>(
set /p x= 0<"path were all the source files are kept\FileOne.txt"
 set x=~20
 set y="C:\Program Files\TightVNC\tvnviewer" -password=zzz %x%
 break1>FileOne.bat
 echo   1>>FileOne.bat
)

C:\>(
set /p x= 0<"path were all the source files are kept\FileTwo.txt"
 set x=~20
 set y="C:\Program Files\TightVNC\tvnviewer" -password=zzz %x%
 break1>FileTwo.bat
 echo   1>>FileTwo.bat
)

我看到它确实创建了循环并创建了文件,但是由于某种原因,某些命令看起来很糟糕。我需要在.bat文件中的循环内声明和使用其他变量吗?

3 个答案:

答案 0 :(得分:3)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于FOR ... DO (block)。< / p>

因此,IF (something) else (somethingelse)将在遇到%variables%时使用IF的值执行。

在您的情况下,yx都在循环中设置,因此使用循环解析时的值。很可能,这些值为空,因此例如echo %y%将被解释为echo,因此将报告当前的echo状态。

解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问已更改的var或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

所以 - 要解决,在setlocal enabledelayedexpansion行之后添加一行@echo off,然后替换%x% or%y%within your loop with!x!or! Y!`

(请参阅关于delayedexpansion)的无穷无尽的文章

BTW - 为什么要删除x的最后20个字符?如果不输入它们会不会更容易?

答案 1 :(得分:1)

在for循环中定义变量时,需要使用延迟扩展。拥有setlocal enabledelayedexpansion命令是不够的;您还需要将%更改为!

FOR %%A in (FileOne FileTwo) DO (

set /p x=<"path were all the source files are kept\%%A.txt"
set x=!x:~20!
set y="C:\Program Files\TightVNC\tvnviewer" -password=zzz !x!
break> %%A.bat
echo !y! >>%%A.bat

)

答案 2 :(得分:0)

您可以在启用延迟环境变量扩展的CMD中运行批处理。

CMD /V:ON

文件中没有setlocal enabledelayedexpansion命令。并且echo %y% >>%%A.bat必须更改为(echo %y%) >>%%A.bat才能删除引号。