如何在捕获 PowerShell 函数 return 值时停止捕获 ROBOCOPY 进度消息?

How can I stop capturing ROBOCOPY progress message when capturing PowerShell function return value?

我曾经有一个叫做robocopy的函数来复制一个非常大的文件并显示进度:

function Invoke-Robocopy {
    ROBOCOPY C:\TEMP\Source\ C:\TEMP\Destination\ Some-Very-Large-File.bak /COPY:DAT
}

我在另一个函数中调用了它:

function Invoke-SomeJob {
    Invoke-Robocopy;
}

这样,robocopy会很好地将进度写入控制台。

问题:

我需要return调用robocopy的函数中的一些东西:

function Invoke-RobocopyAndReturnStuff {
    ROBOCOPY C:\TEMP\Source\ C:\TEMP\Destination\ Some-Very-Large-File.bak /COPY:DAT
    return "blah-blah-blah";
}

而且我需要在我的工作中使用这个 returned 东西:

function Invoke-SomeJobUsingStuff {
    $result = Invoke-RobocopyAndReturnStuff;
    Write-Host $result;
}

现在的问题是,进度似乎是在复制操作期间捕获的,而不是在控制台上显示,只有在复制完成后才显示 $result 包含整个 shebang! (...请原谅我的民间传说)。

有人能告诉我如何实现让 robocopy 输出显示并且只显示 return 我想要的 return 的预期行为吗?

尝试 Tee-Object:

function Invoke-SomeJobUsingStuff {
    Invoke-RobocopyAndReturnStuff | Tee-Object -Variable result
    Write-Host $result;
}

归功于@PetSerAl。这是正确的做法:

function Invoke-RobocopyAndReturnStuffTheRightWay {
    Start-Process -Wait -NoNewWindow ROBOCOPY 'C:\TEMP\Source\ C:\TEMP\Destination\ Some-Very-Large-File.bak /COPY:DAT';
    return "blah-blah-blah";
}

function Invoke-SomeJobUsingStuffTheRightWay {
    $result = Invoke-RobocopyAndReturnStuffTheRightWay;
    Write-Host $result;
}

调用 Invoke-SomeJobUsingStuffTheRightWay 现在执行以下操作:

  1. 控制台的进度完全robocopy通常所做的那样,并且
  2. 最后,Invoke-RobocopyAndReturnStuffTheRightWay只返回字符串"blah-blah-blah"并写入控制台!

这正是我想要的。