说我有这个简单的功能:
Function DoSomething
{
Write-Host "Doing something locally..."
Start-Sleep 5
Return 5
}
现在,假设我希望能够在本地计算机上执行此功能,但也可以使用Powershell远程处理在另一台计算机上执行此功能。问题是Write-Host
不适合这个。实际上,在远程执行脚本的情况下,我不希望句子显示在控制台上,但是我希望收到有关任务进度的信息,所以我这样做了:
Function DoSomething
{
if ([Environment]::UserInteractive -eq $true)
{
Write-Host "Doing something locally..."
}
else
{
Write-Output "Doing something remotely..."
}
Start-Sleep 5
Return 5
}
有了这个,我可以像这样管道这个函数:
Function Pipable {
Param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelinebyPropertyName = $true)]
$value
)
Process {
Write-Host $value
}
}
Invoke-Command -ComputerName "MACHINE" -ScriptBlock {
Function DoSomething
{ ... }
DoSomething
} | Pipable
我的问题是,如果我用以下内容替换DoSomething
的调用:
$value = DoSomething
然后句子"远程做某事......"由于我理解的原因,它不是通过管道发送的,但它阻止了我想要做的事情:
我希望能够在控制台上显示一些信息,如果该功能是在本地执行的,但是当它被远程执行时,我想获得有关状态的信息。在启动PSSession的计算机上处理我自己的方式。写输出似乎对此有用,但我不能在函数中使用它,因为上面解释的原因返回一个值。
有办法吗?
答案 0 :(得分:0)
您仍然可以使用Write-Host。在远程你可以做:
DoSomething *> $Env:TEMP\DoSomething
if ((gc $Env:TEMP\DoSomething) -match 'handle stuff') ...
$out = DoSomething 6> $Env:TEMP\DoSomething
if ((gc $Env:TEMP\DoSomething) -match 'handle stuff') ...