2017-10-06 60 views
0

說,我這個簡單的功能:寫主機和寫輸出繼電器在遠程

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

您仍然可以使用寫主機。在遠程你可以這樣做:

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') ... 
+0

小心解釋一下? :-D – ssougnez

+0

Posh中有多個流(1..6)。寫主機不會破壞你的輸出,所以你可以安全地記錄它/管它。 '6>'將寫主機消息重定向到您可以加載和檢查狀態消息的文件。 '*。'將所有內容重定向到一個文件,以防您不想看到任何輸出。 – majkinetor