嗨,我有一个很简单的脚本,试图读取json输入,然后转换
param(
$proxyinfosjson
)
write-output "proxyinfosjson is $proxyinfosjson"
try {
$proxyinfos = ConvertFrom-Json -InputObject $proxyinfosjson
write-output $proxyinfos
}
catch {
Write-Output "could not convert json input"
}如果我跑了
.\testjson.ps1 -proxyinfosjson '[{"listenport":"443","connectaddress":"10.1.10.20","connectport":"443","firewallrulename":"port443","direction":"Inbound","action":"Allow","protocol":"TCP"},{"listenport":"80","connectaddress":"10.1.10.20","connectport":"80","firewallrulename":"port80","direction":"Inbound","action":"Allow","protocol":"TCP"}]'它工作得很好,我可以看到json输入显示为
proxyinfosjson is [{"listenport":"443","connectaddress":"10.1.10.20","connectport":"443","firewallrulename":"port443","direction":"Inbound","action":"Allow","protocol":"TCP"},{"listenport":"80","connectaddress":"10.1.10.20","connectport":"80","firewallrulename":"port80","direction":"Inbound","action":"Allow","protocol":"TCP"}]但是,如果我跑
powershell -ExecutionPolicy Unrestricted -file testjson.ps1 -proxyinfosjson '[{"listenport":"443","connectaddress":"10.1.10.20","connectport":"443","firewallrulename":"port443","direction":"Inbound","action":"Allow","protocol":"TCP"},{"listenport":"80","connectaddress":"10.1.10.20","connectport":"80","firewallrulename":"port80","direction":"Inbound","action":"Allow","protocol":"TCP"}]'它不起作用,我可以看到json输入显示为
proxyinfosjson is [{listenport:443,connectaddress:10.1.10.20,connectport:443,firewallrulename:port443,direction:Inbound,action:Allow,protocol:TCP},{listenport:80,connectaddress:10.1.10.20,connectport:80,firewallrulename:port80,direction:Inbound,action:Allow,protocol:TCP}]注意到所有的引号都丢失了吗?因此,它不能从json转换,为什么?
发布于 2022-03-02 20:44:31
powershell -ExecutionPolicy Unrestricted -file testjson.ps1 -proxyinfosjson '[{\"listenport\":\"443\",\"connectaddress\":\"10.1.10.20\",\"trimmed\":\"down\"}]'如果你避开了双引号,就像上面那样,它似乎挺好的。找不到权威的文章或论坛文章来解释,但是.似乎传递给powershell.exe的参数与cmd (windows命令提示符)被视为相同的shell解释规则。您还必须在那里转义()引号。
这是我发现的一条与它有关的帖子。微软PowerShell.exe文档在"-file“一节中也提到了这一点。
Escape double quotes in parameter
编辑: Re: Arm模板问题(解决办法)
一个可能的解决办法是在.ps1脚本中重新插入参数的引号,并使用-replace Regex。就像这样。
param($proxyinfosjson)
write-output "INPUT proxyinfosjson is $proxyinfosjson"
$proxyinfosjson = $proxyinfosjson -replace '^\[\{','[{"';
$proxyinfosjson = $proxyinfosjson -replace ':','":"';
$proxyinfosjson = $proxyinfosjson -replace ',','","';
$proxyinfosjson = $proxyinfosjson -replace '\}\]$','"}]';
write-output "RESTORED proxyinfosjson is $proxyinfosjson"认为这些Regex模式应该涵盖字符串中的所有引号。可能会将这四个"-replace“语句折叠成一个单一的、更详细的regex模式,但这超出了我今天的时间。
https://stackoverflow.com/questions/71320174
复制相似问题