繁体   English   中英

在批处理文件FOR循环中的子字符串操作中使用变量

[英]Using variable in sub-string operation in batch file FOR loop

我正在尝试在FOR循环中使用FIXED_LENGTH变量。

直接在循环中使用字符串的长度会得到正确的结果,但是尝试使用变量无效。 有任何想法吗?

提供正确结果的代码段

SETLOCAL ENABLEDELAYEDEXPANSION

REM Loop through the input file and read each line.
FOR /F %%G IN (SVN_URLs_List.txt) DO (

    SET CUR_LINE=%%G
    REM Make sure the variable CUR_LINE is surrounded with ! instead of % to ensure delayed variable expansion.
    @ECHO Processing the line: !CUR_LINE!

    REM Set fixed length of "https://projects.abcdefg.com/subversion/"
    SET FIXED_LENGTH=40

    REM Get the sub-string of CUR_LINE to get the folder name.
    SET FOLDER_NAME=!CUR_LINE:~40!
    @ECHO !FOLDER_NAME!
)
ENDLOCAL

无法产生正确结果的代码段:

SETLOCAL ENABLEDELAYEDEXPANSION

REM Loop through the input file and read each line.
FOR /F %%G IN (SVN_URLs_List.txt) DO (

    SET CUR_LINE=%%G
    REM Make sure the variable CUR_LINE is surrounded with ! instead of % to ensure delayed variable expansion.
    @ECHO Processing the line: !CUR_LINE!

    REM Set fixed length of "https://projects.abcdefg.com/subversion/"
    SET FIXED_LENGTH=40

    REM Get the sub-string of CUR_LINE to get the folder name.
    SET FOLDER_NAME=!CUR_LINE:~!!FIXED_LENGTH!!!
    @ECHO !FOLDER_NAME!
)
ENDLOCAL

我努力了

SET FOLDER_NAME=!CUR_LINE:~!!FIXED_LENGTH!!!
SET FOLDER_NAME=!CUR_LINE:~!FIXED_LENGTH!!
SET FOLDER_NAME=!CUR_LINE:~%FIXED_LENGTH%!

SVN_URLs_List.txt中的输入如下所示:

https://projects.abcdefg.com/subversion/svnrepo1
https://projects.abcdefg.com/subversion/svn_repo_2
https://projects.abcdefg.com/subversion/another repo 3

我期待结果:

svnrepo1
svn_repo_2
another repo 3

第一个片段产生正确的结果。 但是,使用第二个代码段会产生类似以下内容:

https://projects.abcdefg.com/subversion/svnrepo1FIXED_LENGTH
https://projects.abcdefg.com/subversion/svn_repo_2FIXED_LENGTH
https://projects.abcdefg.com/subversion/another repo 3FIXED_LENGTH
SET FOLDER_NAME=!CUR_LINE:~!!FIXED_LENGTH!!!
SET FOLDER_NAME=!CUR_LINE:~!FIXED_LENGTH!!

语法错误。 变量引用在哪里开始/结束? 解析器无法确定它。

SET FOLDER_NAME=!CUR_LINE:~%FIXED_LENGTH%!

解析几乎可以处理此语法,但行为不佳。 由于变量( FIXED_LENGTH )在for代码块内分配了其值,并且解析器在解析之前用变量的值替换了对变量的读取操作(没有延迟的扩展语法来读取变量值)。分配其值后,该操作将失败。

在您的情况下,您可以在for循环之前定义变量,而FIXED_LENGTHfor循环内部定义FIXED_LENGTH变量。 因此,当解析for命令的do子句中的行块时,变量将具有赋值。

如果您希望/需要在for循环中声明变量,则必须使用类似

for %%a in (!FIXED_LENGTH!) do SET FOLDER_NAME=!CUR_LINE:~%%a!

这样,对FIXED_LENGTH的读取操作FIXED_LENGTH被延迟,并分配给for循环的可替换参数,并且该参数将代替子字符串操作中的变量引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM