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



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

我试了如下:

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

输出不好看。如果我运行schtasks的电流输出:

C:Windowssystem32>schtasks
Folder: MicrosoftWindowsWwanSvc
TaskName                               Next Run Time          Status
NotificationTask                         N/A                    Ready
Folder: MicrosoftXblGameSave
TaskName                                 Next Run Time          Status
XblGameSaveTask                          N/A                    Ready

期望输出示例:

Folder: MicrosoftWindowsWwanSvc
TaskName                                      Status
NotificationTask                               Ready
Folder: MicrosoftXblGameSave
TaskName                                       Status
XblGameSaveTask                                Ready

虽然它不能提供与您期望的示例完全相同的输出,但对我来说,下面的(并且更好)似乎是可用的:

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

应该提供如下输出:

Folder: MicrosoftWindowsWwanSvc
TaskName:      MicrosoftWindowsWwanSvcNotificationTask
Status:        Ready
Folder: MicrosoftXblGameSave
TaskName:      MicrosoftXblGameSaveXblGameSaveTask
Status:        Ready

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

Folder: MicrosoftWindowsWwanSvc
TaskName                                 Next Run Time          Status
======================================== ====================== ===============
NotificationTask                         N/A                    Ready
Folder: MicrosoftXblGameSave
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%System32schtasks.exe /Query ^
^| %SystemRoot%System32findstr.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: MicrosoftWindowsWwanSvc
TaskName                                 Status
NotificationTask                         Ready
Folder: MicrosoftXblGameSave
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 *"

最新更新