如何从命令输出中提取/显示任意两列及其值?

问题描述

我需要 schtasks 命令显示的 TaskName 和 Status 列。

我尝试了以下方法

for /f "tokens=1,3 delims= " %i in ('schtasks') DO echo %i

输出不是很漂亮。如果我运行 schtasks 的当前输出

C:\Windows\system32>schtasks
Folder: \Microsoft\Windows\WwanSvc
TaskName                               Next Run Time          Status
NotificationTask                         N/A                    Ready
Folder: \Microsoft\XblGameSave
TaskName                                 Next Run Time          Status
XblGameSaveTask                          N/A                    Ready

示例所需的输出

Folder: \Microsoft\Windows\WwanSvc
TaskName                                      Status
NotificationTask                               Ready
Folder: \Microsoft\XblGameSave
TaskName                                       Status
XblGameSaveTask                                Ready

解决方法

虽然它没有提供与您想要的示例完全相同的输出,但以下内容对我来说似乎是可用的,(和更好的)

schtasks /query /fo list | findstr /r "^Folder: ^TaskName: ^Status: ^$"

应该提供如下输出:

Folder: \Microsoft\Windows\WwanSvc
TaskName:      \Microsoft\Windows\WwanSvc\NotificationTask
Status:        Ready

Folder: \Microsoft\XblGameSave
TaskName:      \Microsoft\XblGameSave\XblGameSaveTask
Status:        Ready

顺便说一句,我不确定您打算使用哪个版本的 Windows,但肯定是从 Windows Vista 到 Windows 10,这是我习惯从 schtasks 看到的输出格式:

Folder: \Microsoft\Windows\WwanSvc
TaskName                                 Next Run Time          Status
======================================== ====================== ===============
NotificationTask                         N/A                    Ready

Folder: \Microsoft\XblGameSave
TaskName                                 Next Run Time          Status
======================================== ====================== ===============
XblGameSaveTask                          N/A                    Ready

这意味着您提供的代码的输出将如下所示:

Folder:
TaskName
========================================
NotificationTask
Folder:
TaskName
========================================
XblGameSaveTask

这也意味着要获得您想要的输出,您需要省略表格标题边框以及第二个表格列。


鉴于此,这里有一种相当 OTT 的方法,可以通过 实现这一目标:

@Echo Off & SetLocal EnableExtensions DisableDelayedExpansion
Set "{=                                          "
For /F "Delims=" %%G In ('%SystemRoot%\System32\schtasks.exe /Query ^
 ^| %SystemRoot%\System32\findstr.exe /R "^[^=]"') Do (Set "}=%%G"
    SetLocal EnableDelayedExpansion & Set "}=!}:  =|!"
    For /F "Tokens=1,3 Delims=|" %%H In ("!}:| =||!") Do If "%%I" == "" (
        Echo %%H) Else Set "z=%%H%{%" & Echo=!z:~,41!%%I
    EndLocal)
Pause

这应该为您输出:

Folder: \Microsoft\Windows\WwanSvc
TaskName                                 Status
NotificationTask                         Ready
Folder: \Microsoft\XblGameSave
TaskName                                 Status
XblGameSaveTask                          Ready
,

使用 PowerShell 非常简单。

Get-ScheduledTask | Select-Object -Property TaskPath,TaskName,State | Format-List *

如果您无法运行 PowerShell 控制台,可以从 cmd.exe 运行。

powershell -NoLogo -NoProfile -Command ^
    "Get-ScheduledTask | Select-Object -Property TaskPath,State | Format-List *"