退出和(&;)登录Powershell

退出和(&;)登录Powershell,powershell,cmd,escaping,ampersand,quoting,Powershell,Cmd,Escaping,Ampersand,Quoting,我需要在ffmpeg--header参数中使用\r\n。这适用于Unix,但不适用于Windows命令提示符。所以我想使用powershell powershell c:\ffmpeg -headers 'User-Agent: user-agent'"`r`n"'Cookies: my-cookie' ... 我知道当使用特殊字符时,我必须使用'string',并且 "`r`n" 作为我的\r\n分隔符 我还测试了我可以将它们混合在一起,比如“this”是“text”,得到这是text 但

我需要在
ffmpeg--header
参数中使用
\r\n
。这适用于Unix,但不适用于Windows命令提示符。所以我想使用
powershell

powershell c:\ffmpeg -headers 'User-Agent: user-agent'"`r`n"'Cookies: my-cookie' ...
我知道当使用特殊字符时,我必须使用
'string'
,并且

"`r`n"
作为我的
\r\n
分隔符

我还测试了我可以将它们混合在一起,比如
“this”是“text”
,得到
这是text

但是,如果我的字符串(cookie或用户代理)包含
&
字符,则会失败

示例:
powershell c:\ffmpeg-headers'Cookies:param=a=1&b=2;会话=123'

如何在一行中“转义”
&
字符


CMD接受这些示例(某些部件被屏蔽),但它们不起作用

powershell -c "c:\ffplay -user_agent ""Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"" -headers ""Cookie: nlqptid=h=676886edeea5bae904b0cf53daec8038.1519940538670&hdnea=exp=1519940598~acl=/*~hmac=C0E019502B060D23AB02BB157FCFFC72404500770A2CE5B00789A84AAEFBD77F&nltid=xxxxxxxxxx&nltdt=0&uid=744826&csid=xxxxxxxxxx; hdntl=exp=1520026938~acl=%2f*~hmac=952689e6de57a2a201ddc1d4c0794962fdc886ea48cf41494a42e787ef923bf9`r`n"" -i ""https://xxxxxxxxxx.net/nlds_vod/xxxxxxxxxx/vod/2018/02/28/cd264e10-dd54-3de2-df90-4c1cac104dcb/v1/stream/cd264e10-dd54-3de2-df90-4c1cac104dcb_1_4500_pc.mp4.m3u8"""

ffplay

必须指定输入文件

但是输入文件是在
-i
参数之后指定的

这个命令有什么问题



请注意,该实现是现有批处理脚本的一部分,因此需要使用批处理文件内部的语法。

cmd.exe调用时,事情会变得棘手;下面是一个简化的示例:

powershell -c "ffmpeg.exe -h \""User-Agent: usra`r`nCookies: parm=a=1&b=2; session=1\"""
简而言之:若要传递PowerShell应视为双引号的参数,请将每个参数括在整个
“…”
字符串的上下文中。
[1]

作为一般要求,文字
%
字符。必须作为
%%
转义,以防止它们被解释为批处理文件中
cmd.exe
变量引用的一部分。从命令提示

  • PowerShell的命令行通过参数
    -c
    (缩写为
    -command
    ,在Windows PowerShell中为默认值,但在PowerShell Core中已更改,现在默认为
    -File

  • cmd.exe
    仅识别
    “…”
    引用
    “…”
    中的元字符被视为文字

  • 由于PowerShell命令本身使用
    “…”
    ,因此为了PowerShell的缘故,嵌入的
    实例必须作为
    \”
    转义(请注意,使用了PowerShell内部
    `

  • 但是,一个开口
    \”
    本身会使
    cmd.exe
    认为后面的字符在其
    “…”
    字符串之外,从而导致
    &
    等字符中断调用,因此
    后面的
    \
    必须加倍,对于嵌入的和成对的双引号,
    产生
    \”
    (原文如此)的整体转义序列


顺便说一句:
'this'”是“'text”
不会像在Bash中那样创建单个字符串;在PowerShell中:

  • 作为一个表达式,它会导致语法错误(请尝试自行执行);您必须使用
    ('this'+'是“+'text')

  • 作为传递给命令(程序)的参数,它被解释为3个不同的参数


[1] 虽然这种方法永远不会中断,但它确实规范化了
\”“…\”“
序列中的空白;也就是说,多个空间的运行将被每个空间替换为一个空间。
如果这是一个问题,您必须使用
\“…\”
并单独使用
^
-escape
cmd.exe
元字符,例如内部的
^

powershell -c "ffmpeg.exe -h \""User-Agent: usra`r`nCookies: parm=a=1&b=2; session=1\"""