Batch file 将Windows命令提示符内容获取到文本文件
我想编写一个批处理实用程序,将命令提示符窗口的输出复制到文件中。我以9999行的最大深度运行命令提示符窗口,有时我想获取输出在屏幕外的命令的输出。我可以使用键Batch file 将Windows命令提示符内容获取到文本文件,batch-file,command-prompt,windows-scripting,Batch File,Command Prompt,Windows Scripting,我想编写一个批处理实用程序,将命令提示符窗口的输出复制到文件中。我以9999行的最大深度运行命令提示符窗口,有时我想获取输出在屏幕外的命令的输出。我可以使用键Ctrl-A,Ctrl-C手动执行此操作,然后将结果粘贴到记事本中-我只想在批处理文件中自动执行此操作,并调用: SaveScreen <text file name> 我可以写: cls call BuildPhase1.bat if "%ErrorLevel% gtr 0 call SaveScreen.bat Bui
Ctrl-A
,Ctrl-C
手动执行此操作,然后将结果粘贴到记事本中-我只想在批处理文件中自动执行此操作,并调用:
SaveScreen <text file name>
我可以写:
cls
call BuildPhase1.bat
if "%ErrorLevel% gtr 0 call SaveScreen.bat BuildPhase1.err & goto :ErrorExit
call BuildPhase2.bat
if "%ErrorLevel% gtr 0 call SaveScreen.bat BuildPhase2.err & goto :ErrorExit
call BuildPhase3.bat
if "%ErrorLevel% gtr 0 call SaveScreen.bat BuildPhase3.err & goto :ErrorExit
或者,当我看到运行失败时,我可以键入SaveScreen batch.log
我的实验让我走了这么远:
<!-- : Begin batch script
@cscript //nologo "%~f0?.wsf" //job:JS
@exit /b
----- Begin wsf script --->
<package>
<job id="JS">
<script language="JScript">
var oShell = WScript.CreateObject("WScript.Shell");
oShell.SendKeys ("hi folks{Enter}") ;
oShell.SendKeys ("^A") ; // Ctrl-A (select all)
oShell.SendKeys ("^C") ; // Ctrl-C (copy)
oShell.SendKeys ("% ES") ; // Alt-space, E, S (select all via menu)
oShell.SendKeys ("% EY") ; // Alt-space, E, Y (copy via menu)
// ... invoke a notepad session, paste the clipboard into it, save to a file
WScript.Quit () ;
</script>
</job>
</package>
Powershell例程与链接中介绍的基本相同,只是:
- 我不得不对它进行消毒,以删除select/copy/paste操作引入的一些更有趣的字符替换
- 原始文件还保存了尾随空格。现在这些都被修剪了
# Get-ConsoleAsText.ps1 (based on: https://devblogs.microsoft.com/powershell/capture-console-screen/)
#
# The script captures console screen buffer up to the current cursor position and returns it in plain text format.
#
# Returns: ASCII-encoded string.
#
# Example:
#
# $textFileName = "$env:temp\ConsoleBuffer.txt"
# .\Get-ConsoleAsText | out-file $textFileName -encoding ascii
# $null = [System.Diagnostics.Process]::Start("$textFileName")
#
if ($host.Name -ne 'ConsoleHost') # Check the host name and exit if the host is not the Windows PowerShell console host.
{
write-host -ForegroundColor Red "This script runs only in the console host. You cannot run this script in $($host.Name)."
exit -1
}
$textBuilder = new-object system.text.stringbuilder # Initialize string builder.
$bufferWidth = $host.ui.rawui.BufferSize.Width # Grab the console screen buffer contents using the Host console API.
$bufferHeight = $host.ui.rawui.CursorPosition.Y
$rec = new-object System.Management.Automation.Host.Rectangle 0,0,($bufferWidth - 1),$bufferHeight
$buffer = $host.ui.rawui.GetBufferContents($rec)
for($i = 0; $i -lt $bufferHeight; $i++) # Iterate through the lines in the console buffer.
{
$Line = ""
for($j = 0; $j -lt $bufferWidth; $j++)
{
$cell = $buffer[$i,$j]
$line = $line + $cell.Character
}
$line = $line.trimend(" ") # remove trailing spaces.
$null = $textBuilder.Append($line)
$null = $textBuilder.Append("`r`n")
}
return $textBuilder.ToString()
控制台缓冲区的内容可以通过评论中提到的PowerShell团队博客中的PS脚本进行检索,该评论现已编辑为OP的问题 最后一行也可以更改为将内容复制到剪贴板,而不是返回
Set-Clipboard -Value $textBuilder.ToString()
作为旁注,在和中讨论了使用
StringBuilder而不是直接连接的原因。控制台缓冲区的内容可以通过评论中提到的PowerShell团队博客中的PS脚本检索,该评论现已编辑为OP的问题
最后一行也可以更改为将内容复制到剪贴板,而不是返回
Set-Clipboard -Value $textBuilder.ToString()
作为旁注,在和中讨论了使用StringBuilder而不是直接连接的原因。可能类似于(使用powershell)。看起来它最多只能访问可见屏幕区域。它似乎占据了屏幕的一个矩形区域,然后返回该区域中的文本。这似乎是一种奇怪的方式。无论控制台窗口中显示什么,都会获取整个缓冲区。它在主机控制台上工作,主机控制台可以是cmd提示符,而不一定是PowerShell自己的控制台。备注:如果矩形完全在屏幕缓冲区之外,将返回一个包含零行和零列的BufferCell数组。如果矩形部分位于屏幕缓冲区之外,将读取并返回屏幕缓冲区和矩形重叠的区域。返回数组的大小与r的大小相同。此数组的非重叠区域中的每个缓冲单元设置如下:(摘自链接)其他位置是否有全文?可能类似(使用powershell)。看起来它最多只能访问可见屏幕区域。它似乎占据了屏幕的一个矩形区域,然后返回该区域中的文本。这似乎是一种奇怪的方式。无论控制台窗口中显示什么,都会获取整个缓冲区。它在主机控制台上工作,主机控制台可以是cmd提示符,而不一定是PowerShell自己的控制台。备注:如果矩形完全在屏幕缓冲区之外,将返回一个包含零行和零列的BufferCell数组。如果矩形部分位于屏幕缓冲区之外,将读取并返回屏幕缓冲区和矩形重叠的区域。返回数组的大小与r的大小相同。此数组的非重叠区域中的每个缓冲单元设置如下:(摘自链接)全文是否在别处可用?
Set-Clipboard -Value $textBuilder.ToString()