我曾经有一个调用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
输出显示并且只返回我想要返回的内容所需的行为?
答案 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
会执行以下操作:
robocopy
通常会这样做,"blah-blah-blah"
返回字符串Invoke-RobocopyAndReturnStuffTheRightWay
并写入控制台!这正是我想要的。