2016-03-14 4 views
1

J'ai un PowerShell interactif utilisant des formulaires Windows, ce qui signifie qu'un script PowerShell affiche certains contrôles sur un formulaire demandant une entrée et exécute finalement robocopy, lorsque l'utilisateur clique sur le bouton.écriture de la sortie robocopy vers la console et le fichier journal

Ceci est un script simple affichant le problème. Vous pouvez copier le code, l'enregistrer dans un script Power Sell et l'exécuter. Il a besoin d'un dossier: \ tmp \ tmp pour fonctionner correctement, voir la fonction CopyFolder.

function createdMainForm { 
    $mainForm = New-Object System.Windows.Forms.Form 

    $btn = New-Object System.Windows.Forms.Button 

    $btn.Text = "RoboCopy" 

    #register click event 
    $btn.add_click({Add_click}) 

    $mainForm.Controls.Add($btn) 

    $mainForm.ShowDialog() 
} 

#click event 
function Add_click() { 
    CopyFolder 
} 

function CopyFolder() { 
    $sourseFolder = "C:\tmp\tmp" 
    $targetFolder = "C:\tmp\tmp2" 

    $Logfile = "c:\tmp\a.log" 

    robocopy $sourseFolder $targetFolder /tee /log:$Logfile 
} 

function ReadMode() { 
    Write-Host Mode [1 for GUI mode] 

    $mode = Read-Host 

    if ($mode -eq 1) { 
     createdMainForm 
    } else { 
     CopyFolder 
    } 
} 

ReadMode 

Je veux saisir l'robocopy progrès dans un fichier journal, ainsi que dans la console.

Toutefois, seul le fichier journal capture la sortie, tandis que la console "se bloque" jusqu'à la fin.

J'ai trouvé que cela fonctionne correctement lorsque PowerShell n'affiche pas de formulaire, mais exécute simplement la commande. Le script fonctionne en deux modes. entrez 1 pour "mode formulaire" n'importe quoi d'autre pour le mode console, où le journal écrit réellement à la console et le fichier. Comment puis-je utiliser le formulaire et afficher la progression dans la console?

Comment?

+0

execute robocopy sur un travail de fond, et de recevoir les données à la fin, de cette façon la forme ne gèle pas, aussi vous pouvez utiliser la minuterie pour vérifier sur des intervalles spécifiques si le travail terminé et ensuite obtenir les données – Avshalom

+0

Il est difficile d'offrir quelque chose sans voir votre code. Actuellement, il semble que vous vouliez écrire sur la ligne de pipe à partir du gestionnaire d'événement de la fenêtre de l'interface graphique. C'est ce que vous essayez de faire? – PetSerAl

+0

PetSerAI, oui vous avez raison. le ajouté le code dans la question. – OJNSim

Répondre

1

Utilisez le robocopy parameters approprié:

/log:<LogFile> écrit la sortie d'état dans le fichier journal (remplace le fichier journal existant).
& hellip;
/tee Ecrit la sortie d'état dans la fenêtre de la console, ainsi que dans le fichier journal.

robocopy $s $t /tee /log:C:\path\to\your.log 

En ce qui concerne la mise à jour de la sortie de votre contrôle embarqué, vous avez probablement besoin de rafraîchir votre formulaire sur un timer:

$timer = New-Object Windows.Forms.Timer 
$timer.Interval = 1000 
$timer.add_tick({$form.Refresh()}) 

Démarrer la minuterie lors de l'appel robocopy et l'arrêter après la commande se termine . Les détails varient en fonction de votre code actuel (que vous avez choisi d'omettre).


Edit: Je pense que je compris enfin ce que vous essayez d'atteindre et ce problème que vous avez pour y arriver.

Vous exécutez robocopy à partir d'un scriptblock associé à un élément de formulaire. En raison de cette sortie STDOUT ne va pas à la console. Vous devez prendre la sortie robocopy (le success output stream) et l'écrire à la console hôte vous:

function CopyFolder() { 
    ... 
    robocopy $sourseFolder $targetFolder /tee /log:$Logfile | Write-Host 
}
+0

Peut-être que je n'étais pas assez clair, ou que je ne vous ai pas complètement suivi ... J'ai modifié la question avec le code approprié. Peut-être que ce sera plus clair. – OJNSim

+0

Ce petit fragment n'est même pas assez éloigné pour rendre quelque chose de plus clair. Veuillez faire de cet extrait un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). –

+0

ok, je me sentais assez. Désolé à ce sujet, j'ai édité la question. Maintenant, il contient un script complet affichant le fichier issue.tx. – OJNSim