Winforms 将robocopy输出写入控制台和日志文件
我有一个使用windows窗体的交互式PowerShell,这意味着当用户单击按钮时,PowerShell脚本会在窗体上显示一些控件,请求输入,并最终运行Winforms 将robocopy输出写入控制台和日志文件,winforms,powershell,logging,robocopy,Winforms,Powershell,Logging,Robocopy,我有一个使用windows窗体的交互式PowerShell,这意味着当用户单击按钮时,PowerShell脚本会在窗体上显示一些控件,请求输入,并最终运行robocopy 这是一个显示问题的简单脚本。 您可以复制代码,将其保存到Power Sell脚本并运行。它需要:\tmp\tmp文件夹才能成功运行,请参阅CopyFolder函数 function createdMainForm { $mainForm = New-Object System.Windows.Forms.Form
robocopy
这是一个显示问题的简单脚本。
您可以复制代码,将其保存到Power Sell脚本并运行。它需要:\tmp\tmp文件夹才能成功运行,请参阅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
我想在日志文件和控制台中捕获robocopy
进度
但是,只有日志文件捕获输出,而控制台“挂起”直到结束
我发现,当PowerShell不显示表单,而只是运行命令时,is工作得很顺利。
脚本有两种工作模式。为“form mode”输入1,为console mode输入其他任何内容,其中日志实际写入console和文件
如何使用表单并在控制台中显示进度?使用适当的:
/log:
将状态输出写入日志文件(覆盖现有日志文件)。…
/tee
将状态输出写入控制台窗口以及日志文件
至于更新嵌入式控件的输出,您可能需要在以下位置刷新表单:
调用robocopy
时启动计时器,并在命令完成后停止计时器。详细信息将根据实际代码(您选择省略)而有所不同
编辑:我想我终于明白了你想要达到的目标以及你在这方面遇到的问题 您正在从与表单元素关联的scriptblock运行
robocopy
。由于该标准输出不会进入控制台。您需要获取robocopy
输出(the)并自己将其写入主机控制台:
function CopyFolder() {
...
robocopy $sourseFolder $targetFolder /tee /log:$Logfile | Write-Host
}
函数CopyFolder(){
...
robocopy$sourseFolder$targetFolder/tee/log:$Logfile |写主机
}
在后台作业上执行robocopy,并在最后接收数据,这样表单就不会冻结,您还可以使用计时器在特定的时间间隔内检查作业是否完成,然后获取数据。如果不看到您的代码,很难提供一些内容。目前,听起来好像您想从GUI窗口的事件处理程序写入管道。这就是你想做的吗?佩瑟莱,是的,你是对的。在问题中添加了代码。@OJNSim如果您只想在控制台中显示结果,那么最简单的方法是将Out Host
添加到您的命令中。我不确定是否理解。你是在说机器人警察指挥部吗?你能给我一个样品吗?我还编辑了这个问题,它现在包括显示问题的2种模式脚本可能是我不够清楚,或者我完全不明白你的意思……我用相关代码修改了这个问题。也许它会更清晰。那个微小的碎片甚至远不足以让任何东西更清晰。请把那个片段写成a。好吧,我觉得够了。很抱歉,我已经编辑了这个问题。现在,它包含了一个完整的脚本,显示了完成该技巧的issue.tx.@PetSerAl。我现在也明白了我的建议。解决了的
$timer = New-Object Windows.Forms.Timer
$timer.Interval = 1000
$timer.add_tick({$form.Refresh()})
function CopyFolder() {
...
robocopy $sourseFolder $targetFolder /tee /log:$Logfile | Write-Host
}