我浏览了所有之前提出的类似问题,但无法找到答案。
我有一个批处理文件,用于创建包含特定文本的新批处理文件,文本取自特定目录。它运行良好,但现在很多代码重复多次,应该是自动化的。
这是我的工作代码:
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文件中的循环内声明和使用其他变量吗?
答案 0 :(得分:3)
在块语句(a parenthesised series of statements)
中,解析整个块并执行然后。块中的任何%var%
将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于FOR ... DO (block)
。< / p>
因此,IF (something) else (somethingelse)
将在遇到%variables%
时使用IF
的值执行。
在您的情况下,y
和x
都在循环中设置,因此使用循环解析时的值。很可能,这些值为空,因此例如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
才能删除引号。