2015-08-19 2 views
0

je l'habitude d'avoir une fonction qui a appelé robocopy pour copier un fichier très volumineux et montrer les progrès:Comment arrêter la capture du message de progression ROBOCOPY lors de la capture de la valeur de retour de la fonction PowerShell?

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

et je l'ai appelé dans une autre fonction:

function Invoke-SomeJob { 
    Invoke-Robocopy; 
} 

De cette façon, robocopy va bien écrire la progression à la console.

Le problème:

Je dois retourner des choses hors de la fonction qui appelle robocopy:

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

Je dois utiliser ce retour des choses dans mon travail:

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

Maintenant, le problème est que la progression semble être capturée pendant l'opération de copie, ne s'affiche pas sur la console et seulement après que la copie est terminée $result contient l'ensemble du shebang! (... pardonnez mon folklore).

Est-ce que quelqu'un pourrait m'éclairer sur comment puis-je obtenir le comportement désiré de laisser la sortie robocopy être affichée et retourner seulement ce que je veux retourner?

+1

'start -Wait -NoNewWindow robocopy 'C: \ TEMP \ Source \ C: \ TEMP \ Destination \ Some-Very-Large-File.bak/COPIE: DAT'' – PetSerAl

+0

Merci @PetSerAl - J'utilisais' Start-Process' mais sans le '-Wait' et le' -NoNewWindow' – fernandoespinosa

Répondre

0

Le crédit va à @PetSerAl. Cela fait la bonne chose:

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; 
} 

Appel Invoke-SomeJobUsingStuffTheRightWay fait maintenant ce qui suit:

  1. Progress à la console exactement comme robocopy normalement faire, et
  2. A la fin, seule la chaîne "blah-blah-blah" est renvoyé par Invoke-RobocopyAndReturnStuffTheRightWay et écrit dans la console!

C'est exactement ce que je voulais.

0

Essayez Tee-Object:

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

Presque là. Mais cela fait deux choses: (1) Il écrit à la console toute la séquence de progression des pourcentages, et (2) Il envoie toutes les sorties à '$ result', que je veux seulement" "blah- blah-blah "' Merci de m'avoir informé de Tee-Object de toute façon! – fernandoespinosa