我的Windows批处理文件中出现“此时意外发生了”错误。就像下面一样。我不知道。有人可以帮帮我吗?感谢
@setlocal EnableExtensions EnableDelayedExpansion
@echo off
SET TEMPERL=%TMP%\perlversion.txt
for /f "tokens=*" %%a in (%TEMPERL%) do (
set line=%%a
if not "%line:subversion%"=="%line%" goto GETVERSION
)
:GETVERSION
set mainver=%line:*perl=%
set mainver=%mainver:~1,1%
echo This is perl %mainver%
:END
endlocal
答案 0 :(得分:2)
试试这个:
@echo off
setlocal EnableExtensions
SET "TEMPERL=%TMP%\perlversion.txt"
for /f "usebackqdelims=" %%a in ("%TEMPERL%") do (
set "line=%%a"
SETLOCAL EnableDelayedExpansion
if not "!line:subversion=!"=="!line!" (
set "mainver=!line:*perl=!"
set "mainver=!mainver:~1,1!"
echo This is Perl !mainver!
)
ENDLOCAL
)
您应该不使用for
留下goto
循环代码块。这会导致cmd
不稳定。
您也可以尝试这个(适用于草莓Perl):
for /f "tokens=2delims=()" %%a in ('perl --version') do echo This is Perl %%a
for /f "tokens=4delims=(v)" %%a in ('perl --version') do echo This is Perl %%a
答案 1 :(得分:1)
在FOR
循环中,您需要
set "line=%%a"
if not "!line:subversion=!"=="%%a" goto GETVERSION
OR
set "line=%%a"
if not "!line:subversion=!"=="%%a" goto GETVERSION
BECAUSE %line%
(或任何%
var %
)表示变量的PARSE-TIME值,即在FOR
开始执行之前的值。 !
var !
表示RUN-TIME值为var
,也就是说,它在循环期间发生变化 - 但只有setlocal enabledelayedexpansion
已执行(它在这个案例)
另请注意第二个=
之前的!
。这会在变量中引入替换字符串 - 替换目标的字符串(在:
和=
之间),结构因此使用任何字符串{{1来计算line
的值被[nothing]取代。
另请注意,subversion
行中的%%a
后面有尾随空格。虽然您发布的内容似乎在经典上是正确的,但是所分配的值中的尾随空格包含在内,因此set line=%%a
和%%a
不是同一个东西。 enclose-the-statement-in-quotes方法确保所分配的字符串中不包含任何杂散尾随空格。最好使用这种结构 - 它可以节省大量的头部划痕,追逐无形的空间。
最后,我无法保证您对!line!
的解码是正确的,因为您尚未在MAINVER
如果您的目标行(文件中不存在包含字符串perlversion.txt
的行(或文件本身)),则可能会出现意外结果。