如何 extract/display 命令输出中的任意两列及其值?

How to extract/display any two columns and their values from command output?

我需要 schtasks 命令显示的任务名称和状态列。

我尝试了以下方法:

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

输出不太好看。当前输出如果 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

使用 PowerShell 非常简单。

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

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

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

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

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

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


鉴于此,这里有一个相当 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