Войти

Показать полную графическую версию : [решено] Помощь со скриптом - проверка наличия файла и процессов


DimmKo
03-05-2018, 09:34
Товарищи, помогите, пожалуйста, написать скрипт для 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
проверить наличие файла test1 »
Проверить наличие файла где?

скопировать test1.a --> test1 »
А если нет test1.a?

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

DimmKo
03-05-2018, 12:01
Спасибо за ваш ответ.
Уточняю.

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

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

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

Iska
03-05-2018, 12:19
лучше тогда, конечно, что-то типа touch test1 »
Переведите, пожалуйста, на русский. Хотелось бы услышать ответ на вопрос: что делать, если файл test1.a не существует?

Если можно использовать глобальные переменные, то тогда там можно пути прописать. »
Переменные окружения не бывают «глобальными».

DimmKo
03-05-2018, 12:51
Переведите, пожалуйста, на русский. Хотелось бы услышать ответ на вопрос: что делать, если файл test1.a не существует? »
попробую.
Предлагаю немного логику поменять. Убрать
скопировать test1.a --> test1

и
создать test1

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

Elven
03-05-2018, 12:59
Упущен вариант с наличием НЕСКОЛЬКИХ одноименных процессов. Пока рыбы набросал...
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
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
Elven, спасибо большое... сейчас попробую на тестовой машине проверить.

НЕСКОЛЬКИХ одноименных процессов »
подразумевается, что имя процессора уникальное и как будто бы нельзя 2 раза запустить. Я на деле не проверял, но может на тестовый закину и попробую.

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


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


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

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

DimmKo
11-05-2018, 14:39
Iska, огромное спасибо за Вашу работу (скрипт).

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

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

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

Спасибо.

Iska
11-05-2018, 14:50
Скажите, пожалуйста, можно ли добавить сюда логирование? Ну что бы он в текстовый документ писал что он делает? »
Можно. А что, собственно, писать-то — весь код из четырёх строчек?!

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

DimmKo
11-05-2018, 16:48
Можно. А что, собственно, писать-то — весь код из четырёх строчек?! »
если бы я знал как))
Не могли бы Вы добавить, пожалуйста?

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

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

Iska
11-05-2018, 17:03
Не могли бы Вы добавить, пожалуйста? »
Держите:
@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
Iska, класс...

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

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

Iska
11-05-2018, 17:37
в bash можно сделать функцию и просто ее вставлять где надо »
DimmKo, например?

DimmKo
16-05-2018, 13:39
Iska, извините, уезжал.

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




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

F_LOG "START"


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

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


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

Iska
16-05-2018, 14:07
DimmKo, спасибо, ясно.

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

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

DimmKo
16-05-2018, 14:36
Iska, спасибо за разъяснение.

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

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

Iska
16-05-2018, 23:17
DimmKo, рад был помочь.




© OSzone.net 2001-2012