将 robocopy 输出写入控制台和日志文件
write robocopy output to console and log file
我有一个使用 windows 表单的交互式 PowerShell,这意味着当用户单击按钮。
这是一个显示问题的简单脚本。
您可以复制代码,将其保存到 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
进度。
但是只有日志文件捕获输出,而控制台 "hangs" 直到结束。
我发现当 PowerShell 不显示表单而只是 运行 命令时,它可以顺利运行。
该脚本以两种模式工作。输入 1 "form mode" 控制台模式的任何其他内容,其中日志实际写入控制台和文件。
如何使用表单,并在控制台显示进度?
使用正确的robocopy
parameters:
/log:<LogFile>
Writes the status output to the log file (overwrites the existing log file).
…
/tee
Writes the status output to the console window, as well as to the log file.
robocopy $s $t /tee /log:C:\path\to\your.log
至于更新嵌入式控件的输出,您可能需要在 timer:
上刷新表单
$timer = New-Object Windows.Forms.Timer
$timer.Interval = 1000
$timer.add_tick({$form.Refresh()})
调用robocopy
时启动定时器,命令完成后停止。详细信息将根据您的实际代码(您选择省略)而有所不同。
编辑: 我想我终于明白了你想要达到的目标以及你遇到了什么问题。
您 运行 robocopy
来自与表单元素关联的脚本块。因为 STDOUT 输出不会进入控制台。您需要获取 robocopy
输出(success output stream)并自己将其写入主机控制台:
function CopyFolder() {
...
robocopy $sourseFolder $targetFolder /tee /log:$Logfile <b>| Write-Host</b>
}
我有一个使用 windows 表单的交互式 PowerShell,这意味着当用户单击按钮。
这是一个显示问题的简单脚本。 您可以复制代码,将其保存到 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
进度。
但是只有日志文件捕获输出,而控制台 "hangs" 直到结束。
我发现当 PowerShell 不显示表单而只是 运行 命令时,它可以顺利运行。 该脚本以两种模式工作。输入 1 "form mode" 控制台模式的任何其他内容,其中日志实际写入控制台和文件。
如何使用表单,并在控制台显示进度?
使用正确的robocopy
parameters:
/log:<LogFile>
Writes the status output to the log file (overwrites the existing log file).
…
/tee
Writes the status output to the console window, as well as to the log file.
robocopy $s $t /tee /log:C:\path\to\your.log
至于更新嵌入式控件的输出,您可能需要在 timer:
上刷新表单$timer = New-Object Windows.Forms.Timer
$timer.Interval = 1000
$timer.add_tick({$form.Refresh()})
调用robocopy
时启动定时器,命令完成后停止。详细信息将根据您的实际代码(您选择省略)而有所不同。
编辑: 我想我终于明白了你想要达到的目标以及你遇到了什么问题。
您 运行 robocopy
来自与表单元素关联的脚本块。因为 STDOUT 输出不会进入控制台。您需要获取 robocopy
输出(success output stream)并自己将其写入主机控制台:
function CopyFolder() {
...
robocopy $sourseFolder $targetFolder /tee /log:$Logfile <b>| Write-Host</b>
}