将Windows命令提示符内容转为文本文件

问题描述 投票:0回答:1

我想写一个批处理实用程序,将命令提示符窗口的输出复制到一个文件中。 我运行命令提示符窗口的最大深度为9999行,偶尔我想抓取输出在屏幕外的命令的输出。 我可以用以下键来手动完成 Ctrl-A, Ctrl-C然后将结果粘贴到记事本中--我只是想通过调用批处理文件来实现自动化。

SaveScreen <text file name>  

我知道我可以用重定向的方法来做 但那会涉及到我需要事先保存批处理命令序列的输出的问题

所以如果我有一个批处理脚本。

call BuildPhase1.bat
if "%ErrorLevel% gtr 0 goto :ErrorExit
call BuildPhase2.bat
if "%ErrorLevel% gtr 0 goto :ErrorExit
call BuildPhase3.bat
if "%ErrorLevel% gtr 0 goto :ErrorExit

我可以写:

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>

我的按键都能进入命令提示符 所以我的窗口大概是正确的 -- 它似乎只是忽略了... CtrlAlt 修饰词。 它还认识到 Ctrl-C 而不是 Ctrl-A. 因为它忽视了 Ctrl-A 要选择所有的文本,Ctrl-C导致批处理文件以为看到了断点命令。

我看到了其他的答案,比如 这个 但他们都是处理使用重定向的方法,而不是事后 "按需 "做的方法。

* 更新

根据@dxiv的指针,这里是该例程的批处理包装。

Get-ConsoleAsText.bat

::  save the contents of the screen console buffer to a disk file.

    @set "_Filename=%~1"
    @if "%_Filename%" equ "" @set "_Filename=Console.txt" 

    @powershell Get-ConsoleAsText.ps1 >"%_Filename%"
    @exit /b 0

Powershell例程与链接中介绍的差不多,只是,我不得不对它进行了清理,以删除selectcopypaste操作中引入的一些更有趣的字符替换。

  • 我必须对它进行消毒,以去除一些更有趣的字符替换,即selectcopypaste操作所引入的。

  • 原始程序还保存了尾部的空格。 现在这些都被修剪掉了。

Get-ConsoleAsText.ps1

# 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()
batch-file command-prompt windows-scripting
1个回答
2
投票

控制台缓冲区的内容可以用PowerShell团队博客中的PS脚本来检索。捕捉控制台画面 在评论中提到的,现在编辑成OP的问题。

最后一行也可以改成将内容复制到剪贴板,而不是返回。

Set-Clipboard -Value $textBuilder.ToString()

顺便说一下,使用一个 StringBuilder 而不是直接的连接,将在 StringBuilder如何在C#内部工作StringBuilder类是如何实现的.

© www.soinside.com 2019 - 2024. All rights reserved.