捕获PowerShell函数返回值时,如何停止捕获ROBOCOPY进度消息?

时间:2015-08-19 21:08:22

标签: powershell console return robocopy

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

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

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

function Invoke-SomeJob {
    Invoke-Robocopy;
}

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

问题:

我需要从调用robocopy的函数中返回一些东西:

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

我需要在我的工作中使用这些返回的东西:

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

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

有人可以告诉我如何才能实现让robocopy输出显示并且只返回我想要返回的内容所需的行为?

2 个答案:

答案 0 :(得分:0)

尝试Tee-Object

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

答案 1 :(得分:0)

归功于@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. 最后,只从"blah-blah-blah"返回字符串Invoke-RobocopyAndReturnStuffTheRightWay并写入控制台!
  3. 这正是我想要的。