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?
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
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
PetSerAI, oui vous avez raison. le ajouté le code dans la question. – OJNSim