如何使($Line_1`n$Line_2)在CMD脚本中工作? [英] How to make ($Line_1`n$Line_2) work in a CMD script?

查看:21
本文介绍了如何使($Line_1`n$Line_2)在CMD脚本中工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在CMD脚本文件中使用以下代码

PowerShell Add-Type -AssemblyName System.Windows.Forms;^
$Line_1 = 'Hello!';^
$Line_2 = 'How are you?';^
[System.Windows.Forms.MessageBox]::Show($Line_1)

以上仅显示($Line_1)
如果使用($Line_1`n$Line_2),则不会显示任何内容。

如何使其同时显示$Line_1$Line_2

推荐答案

明显$Line_1 + "`n" + $Line_2"$Line_1`n$Line_2"工作正常。将命令字符串从cmd发送到PowerShell非常棘手,因为cmd有遗留问题,因为:

    Cmd()中的
  • 是表示块的不同位置的特殊字符
  • 令牌分隔符不仅是<space><tab>,而且是; , = <0x0B> <0x0C> and <0xFF>。这会更改cmd的标记化行为,但被调用的命令可能会再次使用其规则重新解析该命令

根据文档,PowerShell希望命令位于最后一个参数中的单个字符串中(这并不完全正确,因为文档没有正确更新),因此您需要将整个内容引起来或转义所有分隔符。最简单的解决方案是使用一行并转义"`n"中的引号,如下所示

PowerShell "Add-Type -AssemblyName System.Windows.Forms; $Line_1 = 'Hello!'; $Line_2 = 'How are you?'; [System.Windows.Forms.MessageBox]::Show($Line_1 + "`n" + $Line_2)"

如果要将命令放在多行中,则不能将字符串引起来。现在要将整个事件作为一个参数,您需要转义所有空格(在这种情况下,您不需要转义;,可能是因为在将命令行传递给PowerShell之后,它调用GetCommandLineW并再次解析整个事件本身)

PowerShell Add-Type^ -AssemblyName^ System.Windows.Forms;^
$Line_1^ =^ 'Hello!';^
$Line_2^ =^ 'How^ are^ you?';^
[Windows.Forms.MessageBox]::Show($Line_1^ +^ "`n"^ +^ $Line_2)"

或者,您也可以通过直接使用[char]10

获取新行来避免"`n"字符串
PowerShell -Command Add-Type -AssemblyName System.Windows.Forms;^
$Line_1 = 'Hello!';^
$Line_2 = 'How are you?';^
[System.Windows.Forms.MessageBox]::Show($Line_1 + [char]10 + $Line_2)
最后是一个无需任何转义即可工作的解决方案,它利用PowerShell的EncodedCommand选项接收UTF-16命令字符串的Base64编码字符串。您可以通过在PowerShell中运行此命令来获取编码版本

$str = @'
>> Add-Type -AssemblyName System.Windows.Forms;
>> $Line_1 = 'Hello!';
>> $Line_2 = 'How are you?';
>> [System.Windows.Forms.MessageBox]::Show($Line_1 + "`n" + $Line_2)
>> '@
PS C:Usersphucl> [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($str))
QQBkAGQALQBUAHkAcABlACAALQBBAHMAcwBlAG0AYgBsAHkATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVwBpAG4AZABvAHcAcwAuAEYAbwByAG0AcwA7AAoAIAA9ACAAJwBIAGUAbABsAG8AIQAnADsACgAgAD0AIAAnAEgAbwB3ACAAYQByAGUAIAB5AG8AdQA/ACcAOwAKAFsAUwB5AHMAdABlAG0ALgBXAGkAbgBkAG8AdwBzAC4ARgBvAHIAbQBzAC4ATQBlAHMAcwBhAGcAZQBCAG8AeABdADoAOgBTAGgAbwB3ACgAIAArACAAIgAKACIAIAArACAAKQA=

有了编码版本后,您可以从cmd调用它

PowerShell -EncodedCommand QQBkAGQALQBUAHkAcABlACAALQBBAHMAcwBlAG0AYgBsAHkATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVwBpAG4AZABvAHcAcwAuAEYAbwByAG0AcwA7AAoAJABMAGkAbgBlAF8AMQAgAD0AIAAnAEgAZQBsAGwAbwAhACcAOwAKACQATABpAG4AZQBfADIAIAA9ACAAJwBIAG8AdwAgAGEAcgBlACAAeQBvAHUAPwAnADsACgBbAFMAeQBzAHQAZQBtAC4AVwBpAG4AZABvAHcAcwAuAEYAbwByAG0AcwAuAE0AZQBzAHMAYQBnAGUAQgBvAHgAXQA6ADoAUwBoAG8AdwAoACQATABpAG4AZQBfADEAIAArACAAIgBgAG4AIgAgACsAIAAkAEwAaQBuAGUAXwAyACkA

这篇关于如何使($Line_1`n$Line_2)在CMD脚本中工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆