How do I substring a dynamic variable value in windows batch scripting

狂风中的少年 提交于 2020-01-07 08:33:11

问题


Not able to substring the dynamic variable inside forloop in Windows batch script.

I have the properties file in my git hub in the below format. "collectionName=TestCollectionRun.json=test"

So I have written the below code to fetch this values.But the requirement is that I need to strip of the '.json' part from collection name.With the below code I am not able to set/echo that value.Can you please help on this!

@ECHO ON
:BEGIN

IF EXIST "test.properties" ECHO Found properties file, reading file..
SET props=test.properties
setlocal EnableDelayedExpansion

For /F "delims== tokens=1,2,3" %%G in (%props%) Do (
if "%%I" EQU "test" if "%%G" EQU "collectionName" SET collName=%%H(
SET finalCollName=%collName%:~0,-5
ECHO %finalCollName%
)
)
:END

We need the ECHO to return "TestCollectionRun".currently its not returning anything.


回答1:


Given a line content of collectionName=TestCollectionRun.json=test, here's a quick rewrite of what I think you're tring to do:

@Echo Off
Set "props=test.properties"
If Not Exist "%props%" (
    Echo Properties file not found!
    Echo Exiting..
    Timeout /T 3 /NoBreak >NUL
    Exit /B
)
Echo Found properties file, reading file..
For /F "UseBackQ Tokens=1-3 Delims==" %%A In ("%props%") Do (
    If /I "%%C" == "test" If /I "%%A" == "collectionName" Echo %%~nB
)
Pause

If you wanted to do something with the collection name within the loop then you would probably need to use delayed expansion:

@Echo Off
SetLocal DisableDelayedExpansion
Set "props=test.properties"
If Not Exist "%props%" (
    Echo Properties file not found!
    Echo Exiting..
    Timeout /T 3 /NoBreak >NUL
    Exit /B
)
Echo Found properties file, reading file..
For /F "UseBackQ Tokens=1-3 Delims==" %%A In ("%props%") Do (
    If /I "%%C" == "test" If /I "%%A" == "collectionName" (
        Set "collName=%%B"
        SetLocalEnableDelayedExpansion
        Echo !collName!
        Rem Perform substring task on the variable named collName
        Set "finalCollName=!collName%:~0,-5!"
        Echo !finalCollName!
        EndLocal
    )
)
Pause

Note, these answers will not work, as is, if your string is surrounded by doublequotes, (as in your question body), or if the line content differs (e.g. begins with spaces or tabs).

[Edit /]

Looking at your 'after the fact' question in the comments, it is clear that you do not need to substring the variable at all, so should use the first method posted:

Echo Found properties file, reading file..
For /F "UseBackQ Tokens=1-3 Delims==" %%A In ("%props%") Do (
    If /I "%%C" == "test" If /I "%%A" == "collectionName" (
        newman run "%%B" -e "%envName%" --insecure --reporters cli,htmlextra --reporter-htmlextra-export "newman\%BUILD_NUMBER%\%%~nB.html" --disable-unicode
    )
)
Pause

This assumes that both %envName% and %BUILD_NUMBER% have been previously defined correctly.




回答2:


For /F "delims== tokens=1,2,3" %%G in (%props%) Do (
 if "%%I" EQU "test" if "%%G" EQU "collectionName" SET "collName=%%~nH"&echo %%~nH
)
ECHO %CollName%

Note the second ) is now redundant. Your problem has to do with delayedexpansion which you are invoking but not using. call %%collname%% within the for loop would have shown the value after assignment if required.

This code works by interpreting %%H as a filename and assigning simply the name part of %%H (%%~nH)



来源:https://stackoverflow.com/questions/57591703/how-do-i-substring-a-dynamic-variable-value-in-windows-batch-scripting

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!