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

OJN*_*Sim 4 powershell logging robocopy winforms

我有一个使用 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
Run Code Online (Sandbox Code Playgroud)

我想robocopy在日志文件和控制台中捕获进度。

然而,只有日志文件捕获输出,而控制台“挂起”直到结束。

我发现当 PowerShell 不显示表单而只是运行命令时,它可以顺利工作。该脚本有两种工作模式。输入 1 表示“表单模式”,其他任何内容表示控制台模式,其中日志实际写入控制台和文件。

如何使用表单并在控制台中显示进度?

Ans*_*ers 6

使用正确的robocopy参数

/log:<LogFile>将状态输出写入日志文件(覆盖现有日志文件)。

/tee将状态输出写入控制台窗口以及日志文件。

robocopy $s $t /tee /log:C:\path\to\your.log
Run Code Online (Sandbox Code Playgroud)

至于更新嵌入式控件的输出,您可能需要在计时器上刷新表单:

$timer = New-Object Windows.Forms.Timer
$timer.Interval = 1000
$timer.add_tick({$form.Refresh()})
Run Code Online (Sandbox Code Playgroud)

调用时启动计时器robocopy,命令完成后停止计时器。详细信息将根据您的实际代码(您选择忽略)而有所不同。


编辑:我想我终于明白了你想要实现的目标以及你遇到的问题。

您正在robocopy从与表单元素关联的脚本块运行。因为 STDOUT 输出不会发送到控制台。您需要获取robocopy输出(成功输出流)并将其写入主机控制台:

function CopyFolder() {
    ...
    robocopy $sourseFolder $targetFolder /tee /log:$Logfile | Write-Host
}
Run Code Online (Sandbox Code Playgroud)