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