Como fazer SCHtASKS / Query exibir o atributo "múltiplas ações" no resultado da consulta?
2
Eu quero exibir todos os detalhes sobre uma determinada tarefa.
Por exemplo, eu tenho um "MyTask" que tem vários programas para executar como ações , mostrados abaixo:
Eu quero ver a lista de programas que a tarefa é executada na versão de linha de comando do agendador de tarefas (ou: schtasks ).
Então, quando eu corro:
SCHTASKS /Query /TN "\Microsoft\Windows\MyTask" /FO list /v
Mas eu só recebo a frase "múltiplas ações" ao invés das ações / programas atuais para serem executados como mostrado abaixo:
Eu sei que eu poderia usar o /XMLargumento para mostrar a lista dos programas a serem executados, mas e se eu tiver muitas tarefas para gerar resultados? Eu quero que minha saída seja uma lista, ou seja/FO list
Lista de scripts em lote Todos os nomes e comandos de tarefas do Agendador de Tarefas
Eu forneci script em lote abaixo que será executado a partir do Windows 7 e Windows 10 .
Essencialmente, isso irá:
Executar schtasks com o /XMLinterruptor e tubo de todo o XML conteúdo que ele lê através do
findstr comando com o I
switch (case insensitive) filtrando-a apenas para redirecionar as linhas que contêm o <!--e <command>cordas como ouput para um arquivo simples.
O conteúdo do arquivo simples é executado por meio de um script dinâmico do PowerShell que substituirá as marcas XML por nomes de campo mais apropriadamente formatados, cortará qualquer espaço em branco inicial de todas as linhas, removerá toda a linha em branco e, por último, colocará uma nova linha antes de cada um dos
Task Namecampos mas ele ignorará a primeira linha, já que não precisará ter uma linha antes dela - a linha mais alta do arquivo.
Nota: consulte a seção Gotchas abaixo para detalhes de anomalia em potencial e itens a serem observados.
O script em lote
@ECHO ON
SET RptFile=%temp%\TaskSchedReport.txt
:: -- This routine sets temp files
SET RptFileTmp=%temp%\~tmpTaskSchedReport.txt
IF EXIST "%RptFileTmp%" DEL /Q /F "%RptFileTmp%"
SET TmpPSScript=%Temp%\~tmpScheduleTasks.ps1
IF EXIST "%TmpPSScript%" DEL /Q /F "%TmpPSScript%"
:SchTask
schtasks /query /XML | Findstr /I "<!-- <command>">"%RptFileTmp%"
:PowerShell
ECHO $origFile = "%RptFileTmp%" >> "%TmpPSScript%"
ECHO $NewFile = "%RptFile%" >> "%TmpPSScript%"
ECHO $BlankLine = "`r`n" >> "%TmpPSScript%"
ECHO (Get-Content $origFile) ^| Foreach-Object { >> "%TmpPSScript%"
ECHO $_ -replace "<!-- ", 'Task Name (and path): ' -replace "<Command>", 'Command: ' -replace "<[^>]+>", '' -replace '^^\s+', '' -replace '(?m)^^\s*\r?\n', ''>> "%TmpPSScript%"
ECHO } ^| Set-Content $NewFile >> "%TmpPSScript%"
ECHO (Get-Content $NewFile) ^| ? {$_.trim() -ne "" } ^| Set-Content $NewFile >> "%TmpPSScript%"
ECHO (Get-Content $NewFile) ^| Foreach-Object { >> "%TmpPSScript%"
ECHO $_ -replace "Task Name ", ($BlankLine + "Task Name ") -replace "-->", '' >> "%TmpPSScript%"
ECHO } ^| Set-Content $NewFile >> "%TmpPSScript%"
ECHO (Get-Content $NewFile ^| Select-Object -Skip 1) ^| Set-Content $NewFile >> "%TmpPSScript%"
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%TmpPSScript%'"
:: -- Below will open file to view content with the default text editor
explorer.exe "%RptFile%"
Resultados
Task Name (and path): \Adobe Acrobat Update Task
Command: C:\Program Files\Common Files\Adobe\ARM\1.0\AdobeARM.exe
Task Name (and path): \GoogleUpdateTaskMachineCore
Command: C:\Program Files\Google\Update\GoogleUpdate.exe
Task Name (and path): \GoogleUpdateTaskMachineUA
Command: C:\Program Files\Google\Update\GoogleUpdate.exe
Task Name (and path): \TopSecret
Command: C:\Folder\CIA.exe
Command: C:\Folder\FBI.exe
Gotchas
Se você notar um Task Nameitem de campo sem nenhum Commanditem de campo abaixo dele, isso parece ser devido a tarefas agendadas do sistema, etc., que foram Actionslistadas como Custom Handlervalores que não podem ser editados, veja exemplos e captura de tela abaixo.
Exemplo (sem comandos)
Task Name (and path): \Microsoft\Windows\Shell\WindowsParentalControls
Task Name (and path): \Microsoft\Windows\Shell\WindowsParentalControlsMigration
Task Name (and path): \Microsoft\Windows\SideShow\AutoWake
Task Name (and path): \Microsoft\Windows\SideShow\GadgetManager
Task Name (and path): \Microsoft\Windows\SideShow\SessionAgent
Task Name (and path): \Microsoft\Windows\SideShow\SystemDataProviders
Configurações de Tarefa do Agendador de Tarefas (sem comandos / ações)
a beleza disso está além das palavras :) obrigado!
AK_
Isso não está funcionando para mim quando os caminhos das ações têm espaços. Exemplo de saída: Task Name (and path): \PA wake up Command: "C:\Users\IT Command\Documents\Batch Codes\PA\PA.bat"eTask Name (and path): \Example One Command: C:\Users\IT
Desde que você diz: " Eu ainda quero ver os nomes das tarefas em relação ao que suas ações são " no comentário, então você pode usar o exemplo de script em lotes abaixo para obter a saída esperada com o Windows 7 .
Essencialmente, isso irá:
Execute o comando query schtasks detalhado para despejar a saída em um arquivo csv
Com o comando nativa do Windows PowerShell
convertfrom-csv , ele converterá a saída csv em uma lista como formato.
De lá, ele usará o comando de seleção do PowerShell
com a
-propertyopção para obter apenas os valores dos campos que você deseja ver apenas.
O PowerShell em que o
comando com o -notcontainsoperador de comparação filtrará os TaskNameobjetos extras que, por qualquer motivo, copiam o arquivo csv com os
comandos schtasks .
Nota: você é mais limitado com o que pode e não pode usar nativamente para essa tarefa com o Windows 7 do que com os sistemas operacionais Windows mais recentes, como o Windows 10 .
Script em lote explícito
Você pode precisar jogar com o -Width 256parâmetro e usar maior ou menor int.
@ECHO ON
SET RptFile=C:\Folder\Path\TaskSchedReport.txt
SET TmpPSScript=%Temp%\~tmpScheduleTasks.ps1
IF EXIST "%TmpPSScript%" DEL /Q /F "%TmpPSScript%"
ECHO schtasks /query /v /fo csv ^| ConvertFrom-CSV ^| >> "%TmpPSScript%"
ECHO Select -Property "TaskName","Task To Run" ^| >> "%TmpPSScript%"
ECHO Where {$_.TaskName -notcontains "TaskName"} ^| >> "%TmpPSScript%"
ECHO Out-File "%RptFile%" -Width 256 >> "%TmpPSScript%"
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%TmpPSScript%'"
:: -- Below will open file to view content with the default text editor
explorer.exe "%RptFile%"
EXIT
Snippet de saída em lote
TaskName Task To Run
-------- -----------
\Adobe Acrobat Update Task C:\Program Files\Common Files\Adobe\ARM\1.0\AdobeARM.exe
\Adobe Acrobat Update Task C:\Program Files\Common Files\Adobe\ARM\1.0\AdobeARM.exe
\GoogleUpdateTaskMachineCore C:\Program Files\Google\Update\GoogleUpdate.exe /c
\GoogleUpdateTaskMachineCore C:\Program Files\Google\Update\GoogleUpdate.exe /c
\GoogleUpdateTaskMachineUA C:\Program Files\Google\Update\GoogleUpdate.exe /ua /installsource scheduler
\Microsoft\Microsoft Antimalware\Microsoft Antimalware Scheduled Scan c:\Program Files\Microsoft Security Client\\MpCmdRun.exe Scan -ScheduleJob -RestrictPrivileges
\Microsoft\Windows\Active Directory Rights Management Services Client\AD RMS Rights Policy Template Management (Automated) COM handler
\Microsoft\Windows\Active Directory Rights Management Services Client\AD RMS Rights Policy Template Management (Automated) COM handler
\Microsoft\Windows\Active Directory Rights Management Services Client\AD RMS Rights Policy Template Management (Manual) COM handler
\Microsoft\Windows\Autochk\Proxy %windir%\system32\rundll32.exe /d acproxy.dll,PerformAutochkOperations
Tudo em lote
@ECHO ON
SET RptFile=C:\Folder\Path\TaskSchedReport.txt
SET TmpPSScript=%Temp%\~tmpScheduleTasks.ps1
IF EXIST "%TmpPSScript%" DEL /Q /F "%TmpPSScript%"
ECHO schtasks /query /v /fo csv ^| ConvertFrom-CSV ^| >> "%TmpPSScript%"
ECHO Where {$_.TaskName -notcontains "TaskName"} ^| >> "%TmpPSScript%"
ECHO Out-File "%RptFile%" -Width 256 >> "%TmpPSScript%"
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%TmpPSScript%'"
:: -- Below will open file to view content with the default text editor
explorer.exe "%RptFile%"
EXIT
PowerShell nativo explícito
Como bônus, incluí a sintaxe direta do PowerShell que você pode usar para ver os resultados. Teste com e sem sem | FLe compare os resultados.
schtasks /query /v /fo csv | ConvertFrom-CSV |
Select -Property "TaskName","Task To Run" |
Where {$_.TaskName -notcontains "TaskName"} | FL
que besta responda! Estou sem palavras. Obrigado! Eu ainda estou recebendo várias ações quando executo o PowerShell, estou assumindo que é porque estamos usando CSV como formato de saída. Você pode mudar isso para XML e ver se funciona?
AK_
Quando eu executo: schtasks /query /v /fo csv | ConvertFrom-CSV | Select -Property "TaskName","Task To Run" | Where {$_.TaskName -notcontains "TaskName"} | FLainda estou recebendo: o TaskName : \Microsoft\Windows\MyTask Task To Run : Multiple actionsque eu suponho é normal porque a lista de CSV não contém tanta informação quanto XML. O que eu estava pensando que pode ser a solução é implementar um analisador XML de 1-liner que liga cada "tarefa para executar" (mesmo se vários itens) para um "nome da tarefa" entendeu?
AK_
por favor faça - e obrigado novamente por tal resposta detalhada útil!
AK_
parece bom; assim que você tiver um POC em funcionamento; por favor adicione-o à resposta editando-o. obrigado muito!
Task Name (and path): \PA wake up Command: "C:\Users\IT Command\Documents\Batch Codes\PA\PA.bat"
eTask Name (and path): \Example One Command: C:\Users\IT
Desde que você diz: " Eu ainda quero ver os nomes das tarefas em relação ao que suas ações são " no comentário, então você pode usar o exemplo de script em lotes abaixo para obter a saída esperada com o Windows 7 .
Script em lote explícito
Você pode precisar jogar com o
-Width 256
parâmetro e usar maior ou menor int.Snippet de saída em lote
Tudo em lote
PowerShell nativo explícito
Como bônus, incluí a sintaxe direta do PowerShell que você pode usar para ver os resultados. Teste com e sem sem
| FL
e compare os resultados.PowerShell nativo tudo
Mais recursos
fonte
schtasks /query /v /fo csv | ConvertFrom-CSV | Select -Property "TaskName","Task To Run" | Where {$_.TaskName -notcontains "TaskName"} | FL
ainda estou recebendo: oTaskName : \Microsoft\Windows\MyTask Task To Run : Multiple actions
que eu suponho é normal porque a lista de CSV não contém tanta informação quanto XML. O que eu estava pensando que pode ser a solução é implementar um analisador XML de 1-liner que liga cada "tarefa para executar" (mesmo se vários itens) para um "nome da tarefa" entendeu?