PDA

Показать полную графическую версию : [решено] Удалить последнюю строку в выводе for


Numufar
08-06-2021, 10:48
Доброго времени суток. Написал небольшой скрипт:

@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
Numufar, вестимо через файловый поток со счётчиком. На матерном бате это выглядит примерно так:
3<alarm.txt
А счётчик реализуется посредством того же for:
for /l %i in (1,1,17) do ...
А вообще, по-хорошему, проще взять sed ли, vim ли, pwsh (нужное подчеркнуть) и использовать их.

alpap
08-06-2021, 22:29
Powershell

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

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

alpap
09-06-2021, 15:17
не, эта [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
Спасибо за ответы, попробую сделать красивее. Решил извращенно - скачал линуксовые утилиты под windows и командой head выбрал нужное количество строк сверху.

greg zakharov
22-06-2021, 00:13
Решил извращенно - скачал линуксовые утилиты под windows и командой head выбрал нужное количество строк сверху.Вы действительно ещё тот извращенец, коли не в курсе, что есть вполне себе виндовый sed (https://github.com/mbuilov/sed-windows), который может заменить с десяток-другой юниксовых тулз, включая head, tail, cut, tac, cat и дыр и пыр. Кроме того, есть miniperl и miniruby также способные заменить собой множество утилит. Всё перечисленное без каких-либо дополнительных dll - единственные бинарники.




© OSzone.net 2001-2012