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 -Throw
Expected 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
The root cause is that a string returned from a cmdlet call or external program has an invisible extra
[psobject]wrapper, and theInvoke-Commandcmdlet 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-Commandis 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:
Note that using
(hostname).psobject.BaseObjector"$(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
SSHConnectionparameter definition is incomplete: keysPortandSubsystemare missing.Environment data