Winforms 将robocopy输出写入控制台和日志文件

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

我有一个使用windows窗体的交互式PowerShell,这意味着当用户单击按钮时,PowerShell脚本会在窗体上显示一些控件,请求输入,并最终运行
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
}