使用批处理脚本从 json 文件读取 URL
Reading URL from json file by using batch script
我正在通过批处理脚本读取配置 json 文件并动态创建变量。
json 文件的内容如下
{
"ApplicationId":"c2b925c2-e5c9-4534-b855-43534",
"ApplicationProcess":"453453-ca1c-4735-806a-45345",
"VersionComponentId":"4533-35d2-4f0c-bb7a-rtert",
"uDClientFolder":"/udclient/",
"FID":"myId",
"FAuthToken":"mypassword",
"uDeployUrl":"https://myurl:8445",
"outPutDir":"..\Binaries\_PublishedWebsites\OutPut",
}
读取变量的批处理脚本如下
for /f "tokens=1,2 delims=:, " %%a in (' find ":" ^< ".\%jsonConfigFile%" ') do (
set a=%%~a: =%
set b=%%~b: =%
set "%%~a=%%~b"
)
这里我面临两个问题。
1. 无法读取 uDeployUrl,因为它包含://。我只得到 url 的 https 部分。
2. 如果我的 json 在键名前包含 space
"Application":"value"
然后变量名也将在其名称中包含 space 。那么我怎样才能从变量名
中删除开始space
提前致谢。
for /f "tokens=1* delims=:" %%a in ('find ":" "%jsonConfigFile%"') do set "%%~a=%%~b
- 使用
tokens=1*
将:
之后的所有内容都变成%%b
- 使用
~
前缀去除 %%a
周围的引号和 %%b
的开头引号
- 由于
%%b
中的最后一个引号后面跟着 ,
它不会被删除,但我们可以简单地将整个 set
赋值括在双引号中,方法是在它前面加上一个双引号这样最终的分配将是例如 set "uDeployUrl=https://myurl:8445",
- 最后一个逗号将被忽略。
find
的第二个参数是一个文件名,所以不需要通过<
使用输入重定向
首先,您的配置 json 文件无效。 "outPutDir" 对象值中的反斜杠需要转义。因此,有效的 json 将是:
{
"ApplicationId": "c2b925c2-e5c9-4534-b855-43534",
"ApplicationProcess": "453453-ca1c-4735-806a-45345",
"VersionComponentId": "4533-35d2-4f0c-bb7a-rtert",
"uDClientFolder": "/udclient/",
"FID": "myId",
"FAuthToken": "mypassword",
"uDeployUrl": "https://myurl:8445",
"outPutDir": "..\Binaries\_PublishedWebsites\OutPut"
}
我建议使用合适的 JSON 解释器,例如 Xidel:
xidel -s config.json -e "$json() ! eval(x'{.}:=$json/{.}')[0]"
ApplicationId := c2b925c2-e5c9-4534-b855-43534
ApplicationProcess := 453453-ca1c-4735-806a-45345
VersionComponentId := 4533-35d2-4f0c-bb7a-rtert
uDClientFolder := /udclient/
FID := myId
FAuthToken := mypassword
uDeployUrl := https://myurl:8445
outPutDir := ..\Binaries\_PublishedWebsites\OutPut
Xidel 打开 'config.json'。默认情况下 $json
代表 json 的内容。 $json()
包含所有对象属性的序列:
ApplicationId
ApplicationProcess
VersionComponentId
uDClientFolder
FID
FAuthToken
uDeployUrl
outPutDir
这些字符串被馈送到 (!
) eval-function 并且输出可以在上面看到。
实际批量导出这些变量:
FOR /F "delims=" %%A IN ('xidel -s config.json -e "$json() ! eval(x'{.}:=$json/{.}')[0]" --output-format^=cmd') DO %%A
SET ApplicationId=c2b925c2-e5c9-4534-b855-43534
SET ApplicationProcess=453453-ca1c-4735-806a-45345
SET VersionComponentId=4533-35d2-4f0c-bb7a-rtert
SET uDClientFolder=/udclient/
SET FID=myId
SET FAuthToken=mypassword
SET uDeployUrl=https://myurl:8445
SET outPutDir=..\Binaries\_PublishedWebsites\OutPut
我正在通过批处理脚本读取配置 json 文件并动态创建变量。
json 文件的内容如下
{
"ApplicationId":"c2b925c2-e5c9-4534-b855-43534",
"ApplicationProcess":"453453-ca1c-4735-806a-45345",
"VersionComponentId":"4533-35d2-4f0c-bb7a-rtert",
"uDClientFolder":"/udclient/",
"FID":"myId",
"FAuthToken":"mypassword",
"uDeployUrl":"https://myurl:8445",
"outPutDir":"..\Binaries\_PublishedWebsites\OutPut",
}
读取变量的批处理脚本如下
for /f "tokens=1,2 delims=:, " %%a in (' find ":" ^< ".\%jsonConfigFile%" ') do (
set a=%%~a: =%
set b=%%~b: =%
set "%%~a=%%~b"
)
这里我面临两个问题。 1. 无法读取 uDeployUrl,因为它包含://。我只得到 url 的 https 部分。 2. 如果我的 json 在键名前包含 space "Application":"value" 然后变量名也将在其名称中包含 space 。那么我怎样才能从变量名
中删除开始space提前致谢。
for /f "tokens=1* delims=:" %%a in ('find ":" "%jsonConfigFile%"') do set "%%~a=%%~b
- 使用
tokens=1*
将:
之后的所有内容都变成%%b
- 使用
~
前缀去除%%a
周围的引号和%%b
的开头引号
- 由于
%%b
中的最后一个引号后面跟着,
它不会被删除,但我们可以简单地将整个set
赋值括在双引号中,方法是在它前面加上一个双引号这样最终的分配将是例如set "uDeployUrl=https://myurl:8445",
- 最后一个逗号将被忽略。 find
的第二个参数是一个文件名,所以不需要通过<
使用输入重定向
首先,您的配置 json 文件无效。 "outPutDir" 对象值中的反斜杠需要转义。因此,有效的 json 将是:
{
"ApplicationId": "c2b925c2-e5c9-4534-b855-43534",
"ApplicationProcess": "453453-ca1c-4735-806a-45345",
"VersionComponentId": "4533-35d2-4f0c-bb7a-rtert",
"uDClientFolder": "/udclient/",
"FID": "myId",
"FAuthToken": "mypassword",
"uDeployUrl": "https://myurl:8445",
"outPutDir": "..\Binaries\_PublishedWebsites\OutPut"
}
我建议使用合适的 JSON 解释器,例如 Xidel:
xidel -s config.json -e "$json() ! eval(x'{.}:=$json/{.}')[0]"
ApplicationId := c2b925c2-e5c9-4534-b855-43534
ApplicationProcess := 453453-ca1c-4735-806a-45345
VersionComponentId := 4533-35d2-4f0c-bb7a-rtert
uDClientFolder := /udclient/
FID := myId
FAuthToken := mypassword
uDeployUrl := https://myurl:8445
outPutDir := ..\Binaries\_PublishedWebsites\OutPut
Xidel 打开 'config.json'。默认情况下 $json
代表 json 的内容。 $json()
包含所有对象属性的序列:
ApplicationId
ApplicationProcess
VersionComponentId
uDClientFolder
FID
FAuthToken
uDeployUrl
outPutDir
这些字符串被馈送到 (!
) eval-function 并且输出可以在上面看到。
实际批量导出这些变量:
FOR /F "delims=" %%A IN ('xidel -s config.json -e "$json() ! eval(x'{.}:=$json/{.}')[0]" --output-format^=cmd') DO %%A
SET ApplicationId=c2b925c2-e5c9-4534-b855-43534
SET ApplicationProcess=453453-ca1c-4735-806a-45345
SET VersionComponentId=4533-35d2-4f0c-bb7a-rtert
SET uDClientFolder=/udclient/
SET FID=myId
SET FAuthToken=mypassword
SET uDeployUrl=https://myurl:8445
SET outPutDir=..\Binaries\_PublishedWebsites\OutPut