如何在捕获 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
现在执行以下操作:
- 控制台的进度完全如
robocopy
通常所做的那样,并且
- 最后,
Invoke-RobocopyAndReturnStuffTheRightWay
只返回字符串"blah-blah-blah"
并写入控制台!
这正是我想要的。
我曾经有一个叫做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
现在执行以下操作:
- 控制台的进度完全如
robocopy
通常所做的那样,并且 - 最后,
Invoke-RobocopyAndReturnStuffTheRightWay
只返回字符串"blah-blah-blah"
并写入控制台!
这正是我想要的。