远程写入主机和写入输出

时间:2017-10-06 11:26:44

标签: powershell

说我有这个简单的功能:

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的计算机上处​​理我自己的方式。写输出似乎对此有用,但我不能在函数中使用它,因为上面解释的原因返回一个值。

有办法吗?

1 个答案:

答案 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') ...