我有一个powershell脚本,由大厨调用,适用于Windows 2012r2,但在Windows 2016上失败(powershell 5.1.14393.1884)。
我在powershell窗口中粘贴了以下两个命令
$letters = New-Object System.Collections.ArrayList
$letters.AddRange( ('F','G') );
我收到此错误
您无法在空值表达式上调用方法。
查看输出,似乎命令的顺序是相反的。在 New-Object之前,AddRange是。
将;
添加到每个命令的末尾
$letters = New-Object System.Collections.ArrayList;
$letters.AddRange( ('F','G') );
在构造函数需要的情况下使用($ null)调用ArrayList
$letters = New-Object System.Collections.ArrayList($null);
和
$letters = New-Object System.Collections.ArrayList(,$null);
将AddRange作为recommended here
投射到[void]$letters = New-Object System.Collections.ArrayList;
[void] $letters.AddRange( ('F','G') );
为什么powershell 5.1无序运行这些命令?这是一个错误吗?
更新
为了澄清,当我将它们键入/粘贴到PowerShell窗口时,命令会无序运行。当厨师运行命令时,我得到完全相同的错误。由于厨师是'脱壳',它实际上是在为我打字。
更新
实际上有两个问题正在发生。 andyb确定了已知的错误,其中ctrl +v
的行为与右键单击以粘贴在Windows 10 / Windows Server 2016中的行为不同
答案 0 :(得分:3)
这似乎是Windows 10中包含的PowerShell PSReadLine行编辑功能的已知问题。
当使用鼠标右键粘贴具有UNIX行结尾的内容(即LF而不是CRLF)时,PSReadLine会将LF解释为“CTRL-ENTER”,这将转换为“在上面插入行”。
使用CTRL-V进行粘贴,即使使用LF格式的文本也能正常工作。
这并不直接解释厨师行为,除非厨师通过向PowerShell控制台主机发送鼠标单击事件来工作,并且它还发送LF格式的文本。如果是这种情况,则修复将修改厨师行为,以便它发送CRLF而不是LF。
参考文献:
PSReadLine:https://github.com/lzybkr/PSReadLine