首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么以两种不同的方式运行powershell脚本会给出不同的结果

为什么以两种不同的方式运行powershell脚本会给出不同的结果
EN

Stack Overflow用户
提问于 2022-03-02 09:18:04
回答 1查看 51关注 0票数 0

嗨,我有一个很简单的脚本,试图读取json输入,然后转换

代码语言:javascript
复制
param(
    $proxyinfosjson
)
write-output "proxyinfosjson is $proxyinfosjson"

try {
    $proxyinfos = ConvertFrom-Json -InputObject $proxyinfosjson
    write-output $proxyinfos
    
}
catch {
    Write-Output "could not convert json input"
}

如果我跑了

代码语言:javascript
复制
.\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输入显示为

代码语言:javascript
复制
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"}]

但是,如果我跑

代码语言:javascript
复制
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输入显示为

代码语言:javascript
复制
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转换,为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-02 20:44:31

代码语言:javascript
复制
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

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe?view=powershell-5.1

编辑: Re: Arm模板问题(解决办法)

一个可能的解决办法是在.ps1脚本中重新插入参数的引号,并使用-replace Regex。就像这样。

代码语言:javascript
复制
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模式,但这超出了我今天的时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71320174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档