Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удалить последнюю строку в выводе for

Ответить
Настройки темы
CMD/BAT - [решено] Удалить последнюю строку в выводе for

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
@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. Спасибо за помощь.

Отправлено: 10:48, 08-06-2021

 

Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


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

Отправлено: 20:26, 08-06-2021 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:29, 08-06-2021 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:31, 08-06-2021 | #4


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


не, эта [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

Последний раз редактировалось alpap, 10-06-2021 в 01:26.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:17, 09-06-2021 | #5


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:02, 21-06-2021 | #6


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


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

Отправлено: 00:13, 22-06-2021 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удалить последнюю строку в выводе for

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Удалить последнее обновление через командную строку inline Microsoft Windows 7 0 18-12-2018 17:47
CMD/BAT - [решено] Как удалить последнюю строку в текстовом файле? ivanxam Скриптовые языки администрирования Windows 35 18-09-2018 08:33
PowerShell - [решено] Удалить пустую строку в файле mapisic Скриптовые языки администрирования Windows 1 19-08-2015 21:22
CMD/BAT - [решено] Удалить пустую строку в файле .txt denntl Скриптовые языки администрирования Windows 2 18-07-2013 11:48
Удалить строку из меню загрузки ОС ЗВВ Microsoft Windows 2000/XP 3 10-01-2008 00:00




 
Переход