Показать полную графическую версию : [решено] Помощь со скриптом - проверка наличия файла и процессов
Товарищи, помогите, пожалуйста, написать скрипт для Windows XP.
Задача: проверить наличие файла test1:
1) если файл есть, то ничего не делать. Выход.
2) если файла нет, то:
2.1) проверить наличие процесса proc1: Если есть - завершить, если нет - ничего не делать.
2.2) проверить наличие процесса proc2: Если есть - завершить, если нет - ничего не делать.
2.3) скопировать test1.a --> test1, запустить proc1 (тот сам запустит proc2, потому этого достаточно).
Я, к сожалению, в скриптах не силен. В Linux простые скрипты мне даются, а в Windows пока никак.
Буду благодарен за помощь.
Спасибо.
проверить наличие файла test1 »
Проверить наличие файла где?
скопировать test1.a --> test1 »
А если нет test1.a?
запустить proc1 »
Откуда запустить?
Спасибо за ваш ответ.
Уточняю.
Цитата Iska:
Проверить наличие файла где? »
в том же самом каталоге, где будет скрипт
для удобства и т.п., допустим, все лежит в D:\script1
Цитата Iska:
А если нет test1.a? »
лучше тогда, конечно, что-то типа touch test1
Цитата Iska:
Откуда запустить? »
всё в пределах одного каталога.
Если можно использовать глобальные переменные, то тогда там можно пути прописать.
лучше тогда, конечно, что-то типа touch test1 »
Переведите, пожалуйста, на русский. Хотелось бы услышать ответ на вопрос: что делать, если файл test1.a не существует?
Если можно использовать глобальные переменные, то тогда там можно пути прописать. »
Переменные окружения не бывают «глобальными».
Переведите, пожалуйста, на русский. Хотелось бы услышать ответ на вопрос: что делать, если файл test1.a не существует? »
попробую.
Предлагаю немного логику поменять. Убрать
скопировать test1.a --> test1
и
создать test1
Т.е. если файла test1 не существует, то создадим его. Как есть, без расширений и т.п.
в Linux это делает команда touch, как в Windows не знаю.
Упущен вариант с наличием НЕСКОЛЬКИХ одноименных процессов. Пока рыбы набросал...
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 нужен весьма редко, если есть нужность именно создать файл и более ничего. Уже и вспомнить не могу, когда мне это нужно было последний раз.
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 расставляйте сами.
Elven, спасибо большое... сейчас попробую на тестовой машине проверить.
НЕСКОЛЬКИХ одноименных процессов »
подразумевается, что имя процессора уникальное и как будто бы нельзя 2 раза запустить. Я на деле не проверял, но может на тестовый закину и попробую.
Мне сейчас хотя бы понимать, что файл есть или нет, и от этого уже думать.
Конечно, у меня вощникла мысль, расшарить каталог, подцепить его в linux, и там сделать проверку наличия файла. Но хотелось бы штатными средствами это решить.
вообще-то touch делает немного другое. Ну, да ладно. »
а именно изменяет время файла, но если тот существует. Если же файла нет - просто создает его.
Спасибо за помощь.
Сейчас проверю.
Iska, огромное спасибо за Вашу работу (скрипт).
Поставил в планировщик - всё супер.
Скажите, пожалуйста, можно ли добавить сюда логирование? Ну что бы он в текстовый документ писал что он делает?
И еще, могу ли я использовать данный скрипт (со ссылкой на эту тему и на вас, как автора) в написании заметки?
Спасибо.
Скажите, пожалуйста, можно ли добавить сюда логирование? Ну что бы он в текстовый документ писал что он делает? »
Можно. А что, собственно, писать-то — весь код из четырёх строчек?!
И еще, могу ли я использовать данный скрипт (со ссылкой на эту тему и на вас, как автора) в написании заметки? »
Можете. Используйте, кто ж мешает.
Можно. А что, собственно, писать-то — весь код из четырёх строчек?! »
если бы я знал как))
Не могли бы Вы добавить, пожалуйста?
Как пример:
- файл есть - выхожу,
- файла нет:
-- убиваю процесс такой-то,
-- убиваю процесс такой-то,
-- создаю файл,
-- запускаю процесс такой-то.
Соответственно дата и время. Хотя бы понимать как часто пропадает файл.
Спасибо.
Не могли бы Вы добавить, пожалуйста? »
Держите:
@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""
Iska, класс...
Интересно, в bash можно сделать функцию и просто ее вставлять где надо, а тут такое же возможно. Или это уже PowerShell начинается.
Большое спасибо!
в bash можно сделать функцию и просто ее вставлять где надо »
DimmKo, например?
Iska, извините, уезжал.
я вот так делаю (не претендую на правильность)
function F_LOG () {
echo "`date +"%F %T"` $1"
}
F_LOG "START"
здесь просто для примера.
Потом этот F_LOG везде втыкиваю где надо и всё на этом.
Это если в консоль. Так, конечно, делаю перенаправление ">>" в файл.
DimmKo, спасибо, ясно.
В пакетных файлах ОС Windows такого нет. В самом пакетном файле могут использоваться «как бы» подпрограммы/процедуры (наличествует возможность передачи параметров, возврата значений через обращение к переменным окружения вызвавшего контекста, локальные переменные окружения). Кроме того, возможно использование макроподстановок. Но вот именно такого — нет.
Подобное (и многое, многое другое) наличествует в новом командном языке ОС Windows — PowerShell.
Iska, спасибо за разъяснение.
Буду пытаться вникнуть в PowerShell. Правда, давно видел его синтаксис, и как-то мне показалось, что он сложный уж очень...
Кстати, скрипт работает на ура. Ну, по крайней мере, я уже какое время не получаю дурацкие смс, что что-то там не работает (файл когда удаляется, то при старте программы ошибка, т.к. этого файла нет. Для чего он нужен - хз, те кто писал, уже давно уволились).
Смотрю в лог, что-то он туда пишет... красотища!
Вот еще раз Вам спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.