PowerShell Invoke-Expression 在命令字符串中带有与号

Posted

技术标签:

【中文标题】PowerShell Invoke-Expression 在命令字符串中带有与号【英文标题】:PowerShell Invoke-Expression with ampersand in the command string 【发布时间】:2012-09-08 10:37:31 【问题描述】:

我正在尝试将一个带有与号的字符串的变量传递给 Invoke-Expression,它告诉我必须将它放在引号中并将其作为字符串传递。

我尝试了多种转义组合以及在变量中使用原始字符串和字符串以及 "" 和 '' 的组合,但无济于事。我该怎么做?

代码如下:

$streamout_calmedia01 = `
"rtmp://75.126.42.216/livepkgr/calmedialive01?adbe-live-event=liveevent&adbe-record-mode=record"

$streamcmd_calmedia01 = "C:\avconv\usr\bin\avconv.exe 'rtmp://75.126.42.211/transcoder/mobileingest live=1' -f flv -c:v libx264 -r 30 -g 120 -b:v 410000 -c:a aac -ar 22050 -b:a 64000 -strict experimental -y $streamout_calmedia01"

Invoke-Expression "$streamcmd_calmedia01"

我尝试在 & 符号前使用 `,并在 Invoke-Expression 前使用双引号,然后再放入变量,

我已经尝试(如图所示)使用 -Command 为 Invoke-Expression 的变量加上引号,并加上 '&' 和 "&" 并将 & 符号连接到字符串。

我需要其中的 & 符号,以便 Flash Media Server 从流名称中解析命令并在开始 HTTP 实时流分块之前刷新之前记录的数据。

【问题讨论】:

【参考方案1】:

& 符号必须在字符串"&"用双引号括起来,所以你需要转义内部的双引号

$streamout_calmedia01 = "rtmp://...vent`"&`"adbe-record-mode=record"

或将字符串放在单引号中

$streamout_calmedia01 = 'rtmp://...vent"&"adbe-record-mode=record'

【讨论】:

【参考方案2】:

将 $streamout_calmedia01 更改为:

$streamout_calmedia01 = "rtmp://75.126.42.216/livepkgr/calmedialive01?adbe-live-event=liveevent```&adbe-record-mode=record"

然后您必须重新分配 $streamout_calmedia1(使用 $streamout_calmedia1 的新值),它应该可以工作。

【讨论】:

这应该没有效果。 & 不需要在双引号字符串中转义,并且反引号被忽略/丢弃:"&".Length -> 1"``&".Length -> 1 (第二个示例应该只有一个反引号,似乎我无法弄清楚如何放入单个反引号降价反引号代码!) 也许您的意思是使用单引号,或者使用带有 double 反引号的双引号? 不,它应该有 3 个反引号。不知道那里发生了什么。【参考方案3】:

您根本不需要使用Invoke-Expression。避免使用它会排除这个问题。直接调用EXE文件工具即可:

$streamout_calmedia01 = "rtmp://75.126.42.216/livepkgr/calmedialive01?adbe-live-event=liveevent&adbe-record-mode=record"

C:\avconv\usr\bin\avconv.exe 'rtmp://75.126.42.211/transcoder/mobileingest live=1' -f flv -c:v libx264 -r 30 -g 120 -b:v 410000 -c:a aac -ar 22050 -b:a 64000 -strict experimental -y $streamout_calmedia01

这避免了双重转义的所有复杂性,并且应该按照您的意图进行。

【讨论】:

以上是关于PowerShell Invoke-Expression 在命令字符串中带有与号的主要内容,如果未能解决你的问题,请参考以下文章

powershell PowerShell:启动PowerShell作为其他用户提升

powershell [提示输入powershell] #powershell #input #prompt

powershell 测量PowerShell命令或PowerShell脚本的速度

powershell远程下载exe并执行

powershell 使用啥端口

powershell PowerShell使用PowerShell创建本地管理员帐户