Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удалить последнюю строку в выводе for (http://forum.oszone.net/showthread.php?t=348960)

Numufar 08-06-2021 10:48 2959708

Удалить последнюю строку в выводе for
 
Доброго времени суток. Написал небольшой скрипт:

Код:

@echo off
echo 1 > C:\Tools\alarm.txt
for /f "skip=3 tokens=8," %%i in ('schtasks /query /fo table /v') DO (
if /i "%%i" neq "0" (echo 0 > C:\Tools\alarm.txt)
)

Скрипт записывает "1" в файл alarm.txt. Затем в for пропускаются первые 3 строки и выбирается нужный столбец (8) из команды, которая выводит список заданий планировщика заданий (столбец с прошлым результатом запуска) и проверяет в условии if, у всех ли заданий этот столбец равен 0. Если все значения равны 0, то в alarm.txt остаётся "1", если хотя бы одно значение не равно 0, то пишет в alarm.txt "0".
Проблема в том, что сам скрипт так же запускается из планировщика заданий, и в момент работы у задания запуска скрипта появляется новый столбец "Работает", что сдвигает нужный столбец прошлого результата запуска с 8 на 9 место. В 8 столбце вместо "0" оказывается "Работает" и скрипт пишет в alarm.txt "0".
Вопрос - как убрать проверку последней строки (задание самого скрипта)? К примеру, сейчас у меня 14 заданий, командой "schtasks /query /fo table /v" выводится 17 строк. Нужно пропускать первые 3 строки и последнюю 17ую строку. Либо в последней строке проверять не 8 столбец, а 9. Спасибо за помощь.

greg zakharov 08-06-2021 20:26 2959745

Numufar, вестимо через файловый поток со счётчиком. На матерном бате это выглядит примерно так:
Код:

3<alarm.txt
А счётчик реализуется посредством того же for:
Код:

for /l %i in (1,1,17) do ...
А вообще, по-хорошему, проще взять sed ли, vim ли, pwsh (нужное подчеркнуть) и использовать их.

alpap 08-06-2021 22:29 2959756

Powershell
Код:

schtasks /query /fo csv /v|ConvertFrom-CSV|fl 'Имя задачи', 'Прошлый результат'

Iska 08-06-2021 22:31 2959757

Цитата:

Цитата Numufar
Скрипт записывает "1" в файл alarm.txt. »

Вообще-то, нет. Строка Вашего пакетного файла создаёт файл «C:\Tools\alarm.txt» в который записывает строку «1 » (единицу с пробелом). С нулём — аналогично.

alpap 09-06-2021 15:17 2959812

не, эта [schtasks /query /fo csv /v|ConvertFrom-CSV] связка извращенно выводит, не для каждой задачи пойдет и эта в их числе
поэтому поменял на List
PowerShell
Код:

$sQuery = Schtasks /Query /Fo List /V

$ln = @{}
Switch -Regex ($sQuery) {
  'Имя задачи[:]\s+(.*)' {$nameT = $Matches[1]}
  'Прошлый результат[:]\s+(.*)' {
    $LTR = $Matches[1]
    $ln[$nameT] = $LTR
  }
}

$ln.GetEnumerator()|sort Value|% {
  if ($_.Value -eq 0)    {'{0,-12} : [{1}]' -f 'Ok', $_.Key}
  elseif ($_.Value -eq 1) {'{0,-12} : [{1}]' -f 'Error', $_.Key}
  else                    {'{0,-12} : [{1}]' -f $_.Value, $_.Key}
}

если выше Win 7 (вероятно только 10) можно еще так
PowerShell
Код:

$taskInfo = Get-ScheduledTask|Get-ScheduledTaskInfo

$LTR = $taskInfo|% {
  $_|select @{l='Name';e={$_.TaskName}}, @{l='Value';e={$_.LastTaskResult}}
}
$LTR|sort Value
'------'
$LTR|? Value -eq 0


Numufar 21-06-2021 23:02 2960674

Спасибо за ответы, попробую сделать красивее. Решил извращенно - скачал линуксовые утилиты под windows и командой head выбрал нужное количество строк сверху.

greg zakharov 22-06-2021 00:13 2960675

Цитата:

Цитата Numufar
Решил извращенно - скачал линуксовые утилиты под windows и командой head выбрал нужное количество строк сверху.

Вы действительно ещё тот извращенец, коли не в курсе, что есть вполне себе виндовый sed, который может заменить с десяток-другой юниксовых тулз, включая head, tail, cut, tac, cat и дыр и пыр. Кроме того, есть miniperl и miniruby также способные заменить собой множество утилит. Всё перечисленное без каких-либо дополнительных dll - единственные бинарники.


Время: 14:20.

Время: 14:20.
© OSzone.net 2001-