-
Notifications
You must be signed in to change notification settings - Fork 8.1k
Description
The root cause is that a string returned from a cmdlet call or external program has an invisible extra [psobject] wrapper, and the Invoke-Command cmdlet fails to take that possibility into account.
In short: The command below breaks, because (hostname) has such an invisible wrapper, as evidenced by (hostname) -is [psobject] being $true.
This is yet another manifestation of our old friend #5579.
The specific problem in Invoke-Command is here.
Steps to reproduce
{ icm -SSHConnection @{ Hostname = (hostname) } -ScriptBlock { 'hi' } } |
Should -not -ThrowExpected behavior
The test should succeed, if the local computer is set up for being a SSH remoting target.
Actual behavior
The test fails:
Expected no exception to be thrown, but an exception
"The provided SSHConnection hashtable parameter name or element is null or empty." was thrown from line:1 char:3
Note that using (hostname).psobject.BaseObject or "$(hostname)" or (hostname).ToString() makes the problem go away.
As an aside: if the host name were truly invalid due not being a string, the error message would be misleading, because the problem is that the entry is of the wrong type, not that it is null or empty.
A further aside: The comment above the SSHConnection parameter definition is incomplete: keys Port and Subsystem are missing.
Environment data
PowerShell Core v7.0.0-preview.4