1

我正在尝试创建一个动态脚本块,因此我可以在脚本块中使用变量。

这是我的代码:

$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 的相同输出工作正常并连接到服务器。

调查这个问题,我发现将 ISE 输出窗口中的两条生成的行复制/粘贴到记事本中会发现问题:

在此处输入图像描述

正如您在 JPG 中看到的那样,在“@”符号之后添加了一个奇数字符,这会导致命令失败......

知道为什么会发生这种情况(以及我该如何解决)?!?

4

1 回答 1

3

根据@Fredster 的反馈:

事实证明,一个不可见的控制字符已经潜入到这个赋值语句中:

$Servers = "server1", "server2"

通过使用$Servers[0]构建后来转换为脚本块的字符串,该控制字符成为脚本块的不可见部分并导致调用问题。

要诊断此类问题,请将值通过管道传输到Format-Hexcmdlet (PSv5+),它将显示构成字符串的每个字符,包括通常不可见的字符。
警告:默认情况下,仅正确显示 ASCII 范围内的字符;任何其他都简单地表示为文字?--Encoding根据需要使用参数。

于 2017-01-27T23:15:35.903 回答