后 (Powershell:正确转义撇号)我仍然没有弄清楚如何在通过 plink 执行来自 powershell 的命令时正确获取这些转义。
我试图在 Linux 主机上执行的是
df -k / | tail -1 | awk '{print $4}'
这只是给我免费的KB数量/
。
由于我使用的是 powershell (Windows),因此我必须构建一个plink
命令来将命令发送到服务器。简单来说,它看起来像这样:
& plink -ssh -l $user -batch -pw $pw $user@$IP df -k / | tail -1 | awk '{print $4}'
这失败了,因为 PowerShell 会跳转到|
并搜索命令tail
。因此,我必须像这样转义管道:
& plink -ssh -l $user -batch -pw $pw $user@$IP df -k / `| tail -1 `| awk '{print $4}'
这给了我awk: cmd. line:1: Unexpected end of string
。
我认为我必须逃避$4
两次,因为 PowerShell和Linux Bash 尝试用变量替换它。但我该怎么做呢?使用
\`$4
不会改变信息。
答案1
您可以使用plink -ssh -l $user -batch -pw $pw $user@$IP "df -k / | tail -1 | awk '{print `$4}'"
。
Powershell 转义的一般方法:
两个双引号之间的转义字符:
$
需要使用`$
"
需要使用`"
`
需要使用``
例外:
尾随(在双引号末尾)$
根本不需要转义。
两个单引号之间的转义字符:
'
需要使用''
未用引号括起来的转义字符:
$
需要使用`$
@
需要使用`@
#
需要使用`#
`
需要使用``
|
需要使用`|
{
并且需要用and}
进行转义`{
`}
;
需要使用`;
"
需要使用`"
'
需要使用`'
例外:
尾随(在双引号末尾)$
根本不需要转义。
特殊字符总是转义:
`0
:空字符`a
:警报字符`b
:退格字符`f
:换页符`n
:新行字符`r
:回车符`t
:水平制表符`v
:垂直制表符
停止解析特殊字符的特殊方法:
- 从 Powershell 2.0 开始,您可以使用
@' ... '@
它来阻止对参数的解释,但@'
需要与命令位于同一行,参数需要位于下一行,并且'@
需要在参数之后位于自己的行中 - 从 Powershell 3.0 开始,您可以使用
--%
以下命令停止解析所有内容:--%
例子:
$h@h#h`h|h{h}h;h"h'h$
:
- 用双引号括起来:
exampleprogram.exe "`$h@h#h``h|h{h}h;h`"h'h$"
- 用单引号括起来:
exampleprogram.exe '$h@h#h`h|h{h}h;h"h''h'$
- 未用引号引起来:
exampleprogram.exe `$h`@h`#h``h`|h`{h`}h`;h`"h`'h$
- 使用
@' ... '@
:
exampleprogram.exe @'
$h@h#h`h|h{h}h;h"h'h$
'@
- 使用
--%
:exampleprogram.exe --% $h@h#h`h|h{h}h;h"h'h$