如何在批处理文件中迭代 .ini 文件时使用提取的变量来调用命令?
How to use extracted variables to call a command while iterating through a .ini file in a batch file?
来自我最初的。我的目标是遍历 .ini
文件,提取特定部分的 keys 和 values 并使用提取的信息来调用命令。我要迭代的 config.ini
文件如下所示:
[Branches]
trunk=path_to_trunk
k21.1.0.Patch=path_to_k21.1.0.Patch
k21.2.0.Test=path_to_k21.2.0.Test
[Unimportant section]
......
我目前正在按照 aschipfl in my 的建议迭代 config.ini
文件。看看他的回答就知道详情了。
顺便说一下,如果有人能向我解释存储信息的变量在哪里初始化以及我可以在哪里使用它们,我将非常高兴。
无论如何,既然我现在应该有我需要的信息,即使我不知道确切的位置,我想运行一个命令,基于提取的信息。
我想要运行的命令是一个tortoise命令,使用绝对参数可以正常工作,但是当我想要时会出现奇怪的错误消息将变量作为参数传递:
svn log PATH_TO_BRANCH -v --xml --username xxxxxx --password "xxxxxx" > BRANCH.xml
正如你在上面的 config.ini
文件中看到的,变量 PATH_TO_BRANCH
是变量 BRANCH
的原始 value,它在本例中是 key。请注意,achipfl 的建议中变量的命名方式不同。
如果有人能在这里帮助我或对我有任何建议,我将很高兴如何解决我的问题。
输出
首先,我在变量 $%%I
初始化后拆分它,因为 $%%I
包含 key/value 对。之后我调用命令:
for /f "tokens=1*" %%a in ("$%%I") do (
set "branch=%%a"
set "path=%%b"
cmd /c svn log %path% -v --xml --username xxxxxx --password "xxxxxx" > %branch%.xml
)
在 运行 之后我得到这个错误:
svn: E205000: Try 'svn help log' for more information svn:
E205000: 'extensions' option requires 'diff' option
正如我之前所说,如果我使用纯文本而不是变量作为参数,我不会收到此错误。命令 svn help log
仅提供有关命令用法的信息。 XML 文件未创建。
根据您的示例,您破坏了系统 %path%
变量。切勿使用系统变量,因为这会导致本地会话出现问题:
此实例不需要设置任何变量,因为您可以使用元变量:
@echo off
for /F "delims=:" %%N in ('findstr /I /N /C:"[items]" "config.ini"') do set "SKIP=%%N"
for /F "usebackq tokens=1,* skip=%SKIP% delims==" %%I in ("config.ini") do (
if "%%J" == "" exit /b
svn log "%%J" -v --xml --username "xxxxxx" --password "xxxxxx" > "%%I.xml"
)
如果你真的必须设置变量,那么:
@echo off
setlocal enabledelayedexpansion
for /F "delims=:" %%N in ('findstr /I /N /C:"[items]" "config.ini"') do set "SKIP=%%N"
for /F "usebackq tokens=1,* skip=%SKIP% delims==" %%I in ("config.ini") do (
set "branch=%%I"
set "svnpath=%%J"
if "%%J" == "" exit /b
svn log "!svnpath!" -v --xml --username "xxxxxx" --password "xxxxxx" > "!branch!.xml"
)
来自我最初的.ini
文件,提取特定部分的 keys 和 values 并使用提取的信息来调用命令。我要迭代的 config.ini
文件如下所示:
[Branches]
trunk=path_to_trunk
k21.1.0.Patch=path_to_k21.1.0.Patch
k21.2.0.Test=path_to_k21.2.0.Test
[Unimportant section]
......
我目前正在按照 aschipfl in my config.ini
文件。看看他的回答就知道详情了。
顺便说一下,如果有人能向我解释存储信息的变量在哪里初始化以及我可以在哪里使用它们,我将非常高兴。
无论如何,既然我现在应该有我需要的信息,即使我不知道确切的位置,我想运行一个命令,基于提取的信息。
我想要运行的命令是一个tortoise命令,使用绝对参数可以正常工作,但是当我想要时会出现奇怪的错误消息将变量作为参数传递:
svn log PATH_TO_BRANCH -v --xml --username xxxxxx --password "xxxxxx" > BRANCH.xml
正如你在上面的 config.ini
文件中看到的,变量 PATH_TO_BRANCH
是变量 BRANCH
的原始 value,它在本例中是 key。请注意,achipfl 的建议中变量的命名方式不同。
如果有人能在这里帮助我或对我有任何建议,我将很高兴如何解决我的问题。
输出
首先,我在变量 $%%I
初始化后拆分它,因为 $%%I
包含 key/value 对。之后我调用命令:
for /f "tokens=1*" %%a in ("$%%I") do (
set "branch=%%a"
set "path=%%b"
cmd /c svn log %path% -v --xml --username xxxxxx --password "xxxxxx" > %branch%.xml
)
在 运行 之后我得到这个错误:
svn: E205000: Try 'svn help log' for more information svn:
E205000: 'extensions' option requires 'diff' option
正如我之前所说,如果我使用纯文本而不是变量作为参数,我不会收到此错误。命令 svn help log
仅提供有关命令用法的信息。 XML 文件未创建。
根据您的示例,您破坏了系统 %path%
变量。切勿使用系统变量,因为这会导致本地会话出现问题:
此实例不需要设置任何变量,因为您可以使用元变量:
@echo off
for /F "delims=:" %%N in ('findstr /I /N /C:"[items]" "config.ini"') do set "SKIP=%%N"
for /F "usebackq tokens=1,* skip=%SKIP% delims==" %%I in ("config.ini") do (
if "%%J" == "" exit /b
svn log "%%J" -v --xml --username "xxxxxx" --password "xxxxxx" > "%%I.xml"
)
如果你真的必须设置变量,那么:
@echo off
setlocal enabledelayedexpansion
for /F "delims=:" %%N in ('findstr /I /N /C:"[items]" "config.ini"') do set "SKIP=%%N"
for /F "usebackq tokens=1,* skip=%SKIP% delims==" %%I in ("config.ini") do (
set "branch=%%I"
set "svnpath=%%J"
if "%%J" == "" exit /b
svn log "!svnpath!" -v --xml --username "xxxxxx" --password "xxxxxx" > "!branch!.xml"
)