Powershell ISE 中脚本块的奇怪问题:将其字符串表示粘贴到记事本中会显示意外字符
Odd issue with scriptblock in Powershell ISE: pasting its string representation into Notepad reveals unexpected character
我正在尝试创建一个动态脚本块,因此我可以在脚本块中使用变量。
这是我的代码:
$Servers = "server1", "server2"
$Command = "c:\plink -t user@" + $Servers[0] + " -pw 'password'"
$Command = [Scriptblock]::Create($Command)
$Command2 = {c:\plink -t user@server1 -pw 'password'}
$command
$command2
运行 PowerShell ISE 中的脚本生成了我所期望的:
c:\plink -t user@server1 -pw 'password'
c:\plink -t user@server1 -pw 'password'
$command 和 $command2 都呈现相同的输出,并且在使用 Get-Member -Verbose 检查时都是有效的脚本块。
我的问题是执行第一行会产生连接错误,$command2 的相同输出工作正常并连接到服务器。
查看问题,我发现 copy/pasting ISE 到记事本的输出 window 中的两条生成行揭示了问题:
正如您在 JPG 中看到的那样,在“@”符号之后添加了一个奇怪的字符,这会导致命令失败...
知道为什么会这样吗(以及我该如何解决)?!?
根据@Fredster 的反馈:
事实证明,一个不可见的控制字符已经悄悄进入这个赋值语句:
$Servers = "server1", "server2"
通过使用 $Servers[0]
构建稍后转换为脚本块的字符串,该控制字符成为脚本块的不可见部分并导致调用问题。
要诊断此类问题,请将值传递给 Format-Hex
cmdlet (PSv5+),这将显示组成字符串的每个字符,包括通常不可见的字符。
警告:默认情况下,只有 ASCII 范围内的字符才能正确显示;任何其他的都简单地表示为文字 ?
- 根据需要使用 -Encoding
参数。
我正在尝试创建一个动态脚本块,因此我可以在脚本块中使用变量。
这是我的代码:
$Servers = "server1", "server2"
$Command = "c:\plink -t user@" + $Servers[0] + " -pw 'password'"
$Command = [Scriptblock]::Create($Command)
$Command2 = {c:\plink -t user@server1 -pw 'password'}
$command
$command2
运行 PowerShell ISE 中的脚本生成了我所期望的:
c:\plink -t user@server1 -pw 'password'
c:\plink -t user@server1 -pw 'password'
$command 和 $command2 都呈现相同的输出,并且在使用 Get-Member -Verbose 检查时都是有效的脚本块。
我的问题是执行第一行会产生连接错误,$command2 的相同输出工作正常并连接到服务器。
查看问题,我发现 copy/pasting ISE 到记事本的输出 window 中的两条生成行揭示了问题:
正如您在 JPG 中看到的那样,在“@”符号之后添加了一个奇怪的字符,这会导致命令失败...
知道为什么会这样吗(以及我该如何解决)?!?
根据@Fredster 的反馈:
事实证明,一个不可见的控制字符已经悄悄进入这个赋值语句:
$Servers = "server1", "server2"
通过使用 $Servers[0]
构建稍后转换为脚本块的字符串,该控制字符成为脚本块的不可见部分并导致调用问题。
要诊断此类问题,请将值传递给 Format-Hex
cmdlet (PSv5+),这将显示组成字符串的每个字符,包括通常不可见的字符。
警告:默认情况下,只有 ASCII 范围内的字符才能正确显示;任何其他的都简单地表示为文字 ?
- 根据需要使用 -Encoding
参数。