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

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

DimmKo 03-05-2018 09:34 2811853

Помощь со скриптом - проверка наличия файла и процессов
 
Товарищи, помогите, пожалуйста, написать скрипт для Windows XP.

Задача: проверить наличие файла test1:
1) если файл есть, то ничего не делать. Выход.

2) если файла нет, то:
2.1) проверить наличие процесса proc1: Если есть - завершить, если нет - ничего не делать.
2.2) проверить наличие процесса proc2: Если есть - завершить, если нет - ничего не делать.
2.3) скопировать test1.a --> test1, запустить proc1 (тот сам запустит proc2, потому этого достаточно).

Я, к сожалению, в скриптах не силен. В Linux простые скрипты мне даются, а в Windows пока никак.

Буду благодарен за помощь.

Спасибо.

Iska 03-05-2018 10:58 2811870

Цитата:

Цитата DimmKo
проверить наличие файла test1 »

Проверить наличие файла где?

Цитата:

Цитата DimmKo
скопировать test1.a --> test1 »

А если нет test1.a?

Цитата:

Цитата DimmKo
запустить proc1 »

Откуда запустить?

DimmKo 03-05-2018 12:01 2811876

Спасибо за ваш ответ.
Уточняю.

Цитата Iska:
Проверить наличие файла где? »
в том же самом каталоге, где будет скрипт
для удобства и т.п., допустим, все лежит в D:\script1

Цитата Iska:
А если нет test1.a? »
лучше тогда, конечно, что-то типа touch test1

Цитата Iska:
Откуда запустить? »
всё в пределах одного каталога.
Если можно использовать глобальные переменные, то тогда там можно пути прописать.

Iska 03-05-2018 12:19 2811878

Цитата:

Цитата DimmKo
лучше тогда, конечно, что-то типа touch test1 »

Переведите, пожалуйста, на русский. Хотелось бы услышать ответ на вопрос: что делать, если файл test1.a не существует?

Цитата:

Цитата DimmKo
Если можно использовать глобальные переменные, то тогда там можно пути прописать. »

Переменные окружения не бывают «глобальными».

DimmKo 03-05-2018 12:51 2811883

Цитата:

Цитата Iska
Переведите, пожалуйста, на русский. Хотелось бы услышать ответ на вопрос: что делать, если файл test1.a не существует? »

попробую.
Предлагаю немного логику поменять. Убрать
скопировать test1.a --> test1

и
создать test1

Т.е. если файла test1 не существует, то создадим его. Как есть, без расширений и т.п.
в Linux это делает команда touch, как в Windows не знаю.

Elven 03-05-2018 12:59 2811887

Упущен вариант с наличием НЕСКОЛЬКИХ одноименных процессов. Пока рыбы набросал...
Код:

if not exist test1 (
        for /f "tokens=2" %%i in ('tasklist ^| findstr ^"proc1.exe proc2.exe^"') do (
                taskkill /PID %%i /F
        )
        if exist test1.a (
                copy test1.a test1
                start proc1.exe
        ) ELSE (
                type NUL > test1
                start proc1.exe
        )
)

DimmKo, в линях файл создать можно не только touch, собственно touch нужен весьма редко, если есть нужность именно создать файл и более ничего. Уже и вспомнить не могу, когда мне это нужно было последний раз.

Iska 03-05-2018 13:14 2811893

DimmKo, вообще-то touch делает немного другое. Ну, да ладно.
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

if not exist "%~dp0test1" (
        >nul 2>&1 taskkill.exe /im "proc1" /im "proc2"
        >nul copy nul "%~dp0test1"
        start "" "%~dp0proc1"
)

endlocal
exit /b 0

Реальные имена вместо test1, proc1, proc2 расставляйте сами.

DimmKo 03-05-2018 13:15 2811894

Elven, спасибо большое... сейчас попробую на тестовой машине проверить.

Цитата:

Цитата Elven
НЕСКОЛЬКИХ одноименных процессов »

подразумевается, что имя процессора уникальное и как будто бы нельзя 2 раза запустить. Я на деле не проверял, но может на тестовый закину и попробую.

Мне сейчас хотя бы понимать, что файл есть или нет, и от этого уже думать.

Скрытый текст

Конечно, у меня вощникла мысль, расшарить каталог, подцепить его в linux, и там сделать проверку наличия файла. Но хотелось бы штатными средствами это решить.


Цитата:

Цитата Iska
вообще-то touch делает немного другое. Ну, да ладно. »

а именно изменяет время файла, но если тот существует. Если же файла нет - просто создает его.

Спасибо за помощь.
Сейчас проверю.

DimmKo 11-05-2018 14:39 2813175

Iska, огромное спасибо за Вашу работу (скрипт).

Поставил в планировщик - всё супер.

Скажите, пожалуйста, можно ли добавить сюда логирование? Ну что бы он в текстовый документ писал что он делает?

И еще, могу ли я использовать данный скрипт (со ссылкой на эту тему и на вас, как автора) в написании заметки?

Спасибо.

Iska 11-05-2018 14:50 2813177

Цитата:

Цитата DimmKo
Скажите, пожалуйста, можно ли добавить сюда логирование? Ну что бы он в текстовый документ писал что он делает? »

Можно. А что, собственно, писать-то — весь код из четырёх строчек?!

Цитата:

Цитата DimmKo
И еще, могу ли я использовать данный скрипт (со ссылкой на эту тему и на вас, как автора) в написании заметки? »

Можете. Используйте, кто ж мешает.

DimmKo 11-05-2018 16:48 2813214

Цитата:

Цитата Iska
Можно. А что, собственно, писать-то — весь код из четырёх строчек?! »

если бы я знал как))
Не могли бы Вы добавить, пожалуйста?

Как пример:
- файл есть - выхожу,
- файла нет:
-- убиваю процесс такой-то,
-- убиваю процесс такой-то,
-- создаю файл,
-- запускаю процесс такой-то.

Соответственно дата и время. Хотя бы понимать как часто пропадает файл.
Спасибо.

Iska 11-05-2018 17:03 2813220

Цитата:

Цитата DimmKo
Не могли бы Вы добавить, пожалуйста? »

Держите:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

if not exist "%~dp0test1" (
        echo %date% %time%        File [%~dp0test1] not found.
        echo %date% %time%        Try killing processes [proc1] and [proc2]...
        >nul 2>&1 taskkill.exe /im "proc1" /im "proc2"
        echo %date% %time%        Creating file [%~dp0test1].
        >nul copy nul "%~dp0test1"
        echo %date% %time%        Try executing process from file [%~dp0proc1]...
        start "" "%~dp0proc1"
) else (
        echo %date% %time%        File [%~dp0test1] found.
)

endlocal
exit /b 0

При вызове пакетного файла задаёте перенаправление вывода во внешний файл, наподобие:
Код:

"%comspec%" /c">>"Output.txt" 2>&1 "C:\Мои проекты\0157\0001.cmd""

DimmKo 11-05-2018 17:10 2813226

Iska, класс...

Интересно, в bash можно сделать функцию и просто ее вставлять где надо, а тут такое же возможно. Или это уже PowerShell начинается.

Большое спасибо!

Iska 11-05-2018 17:37 2813233

Цитата:

Цитата DimmKo
в bash можно сделать функцию и просто ее вставлять где надо »

DimmKo, например?

DimmKo 16-05-2018 13:39 2813951

Iska, извините, уезжал.

я вот так делаю (не претендую на правильность)

функция (bash) для логирования

Код:


function F_LOG () {
echo "`date +"%F %T"` $1"
}

F_LOG "START"

здесь просто для примера.

Потом этот F_LOG везде втыкиваю где надо и всё на этом.


Это если в консоль. Так, конечно, делаю перенаправление ">>" в файл.

Iska 16-05-2018 14:07 2813958

DimmKo, спасибо, ясно.

В пакетных файлах ОС Windows такого нет. В самом пакетном файле могут использоваться «как бы» подпрограммы/процедуры (наличествует возможность передачи параметров, возврата значений через обращение к переменным окружения вызвавшего контекста, локальные переменные окружения). Кроме того, возможно использование макроподстановок. Но вот именно такого — нет.

Подобное (и многое, многое другое) наличествует в новом командном языке ОС Windows — PowerShell.

DimmKo 16-05-2018 14:36 2813966

Iska, спасибо за разъяснение.

Буду пытаться вникнуть в PowerShell. Правда, давно видел его синтаксис, и как-то мне показалось, что он сложный уж очень...

Кстати, скрипт работает на ура. Ну, по крайней мере, я уже какое время не получаю дурацкие смс, что что-то там не работает (файл когда удаляется, то при старте программы ошибка, т.к. этого файла нет. Для чего он нужен - хз, те кто писал, уже давно уволились).
Смотрю в лог, что-то он туда пишет... красотища!
Вот еще раз Вам спасибо!

Iska 16-05-2018 23:17 2814094

DimmKo, рад был помочь.


Время: 16:15.

Время: 16:15.
© OSzone.net 2001-