Войти

Показать полную графическую версию : Скрипт, проверяющий программу и предлагающий ее запустить если она вырубилась


Страниц : 1 [2]

Iska
28-08-2018, 19:46
домена наверное нет (это большая локалка. То есть есть айпишники каждой кассы (где-то) »
Жаль.

P>S> если я делаю ярлык на скрипт и копирую его (к примеру) себе на свой комп, то путь к ярлыку меняется на тот,где я положил у себя на компе файл. »
Там с ярлыками много хуже — в нём, в числе прочих путей, остаётся тот абсолютный путь, с которым он был создан, включая имя машины :) (особую радость это доставляет, когда машина, где создавался ярлык, выводится из сети). Таковы особенности реализации и внутренней структуры ярлыков. Именно потому крайне рекомендуется не копировать ярлыки между машинами, а создавать ярлыки непосредственно на искомой машине.

Я бы сделал проще — добавил путь типа:
"c:\Windows\System32\wscript.exe" "C:\Мои проекты\0190\0001.vbs"
в раздел реестра, отвечающий за автозагрузку, каждой машины, либо в общий раздел автозагрузки, либо в раздел автозагрузки пользователя. Мне сложно сказать, как именно для Вас будет проще сделать.

YuS_2
28-08-2018, 20:23
там разные. есть винХП есть вин8 есть вин10 »
Возможно, на XP отсутствует, но это поправимо...
что такое пауершелл я хз »
Ну, например, это:
script.ps1
add-type -assembly system.windows.forms
$process = 'notepad'
$start = {c:\windows\notepad.exe}

do {
if (!($p = ps $process -ea 0)){
&$start
$p = ps $process
}
$btn = [windows.forms.messageboxbuttons]::yesno
$t1 = [Windows.Forms.MessageBoxIcon]::Question
$t2 = [Windows.Forms.MessageBoxDefaultButton]::Button1
$top = [Windows.Forms.MessageBoxOptions]::ServiceNotification # .topmost = $true

wait-process $p.id
$res = [windows.forms.messagebox]::show($process, "Запускаем файл?",$btn,$t1,$t2,$top)
} while ($res -ne 'No')
запустить можно так:
run.bat
@echo off
start "" powershell -ex bypass -w hidden -f .\script.ps1

т.к. messagebox - плохо настраиваемая форма (вывести на передний план я не смог, знаний, наверное, маловато), но можно свою форму наваять, примерно так:
add-type -assembly system.windows.forms
$process = 'notepad'
$start = {c:\windows\notepad.exe}

do {
if (!($p = ps $process -ea 0)){
&$start
$p = ps $process
}
$form = new-object windows.forms.form
$form.autosize = $true
$form.autosizemode = [windows.forms.autosizemode]::growandshrink
$form.formborderstyle = [windows.forms.formborderstyle]::fixedtoolwindow
$form.controlbox = $false
$form.sizegripstyle = [windows.forms.sizegripstyle]::hide
$form.text = 'Запустить' + ' ' + $process + '?'
$form.showintaskbar = $false
$form.topmost = $true
$form.startposition = 'CenterScreen'


$btnyes = new-object windows.forms.button
$btnyes.text = 'Да'
$btnyes.location = new-object system.drawing.point(3,10)
$btnyes.dialogresult = [windows.forms.dialogresult]::ok
$form.controls.add($btnyes)

$btnno = new-object windows.forms.button
$btnno.text = 'Нет'
$btnno.location = new-object system.drawing.point(110,10)
$btnno.dialogresult = [windows.forms.dialogresult]::no
$form.controls.add($btnno)

wait-process $p.id
$res = $form.showdialog()
} while ($res -ne 'No')

koresaram
28-08-2018, 21:09
опаньки! еще нюанс вариант появился
а как добавить вызов этого скрипта в другой скрипт на вбс, который стоит в планировщике?
на кассах в планировщике есть скрипт 1.vbs который выполняется раз в минуту. Туда в него же можно включить запуск нашего скрипта?

Iska
28-08-2018, 21:24
powershell -ex bypass -w hidden -f .\script.ps1 »
В гробу я видал такую реализацию сокрытия — будучи запущен из-под Far Manager, он, ничтоже сумняшеся, нахрен скрыл его консоль :). С концами.

(вывести на передний план я не смог, »
А если так:
$res = [Windows.Forms.MessageBox]::Show($process, "Запускаем файл?", $btn, [Windows.Forms.MessageBoxIcon]::Question, [Windows.Forms.MessageBoxDefaultButton]::Button1, [Windows.Forms.MessageBoxOptions]::ServiceNotification)
?

Самым правильным, конечно, было бы использование перегрузки метода с использованием первым параметром следующего:

owner
IWin32Window

An implementation of IWin32Window that will own the modal dialog box.

но я не знаю, допустимо ли в качестве IWin32Window использовать десктоп, и если допустимо — то как именно допустимо.

на кассах в планировщике есть скрипт 1.vbs который выполняется раз в минуту. Туда в него же можно включить запуск нашего скрипта? »
Зачем? Не нужно.

YuS_2
28-08-2018, 21:47
В гробу я видал такую реализацию сокрытия — будучи запущен из-под Far Manager, он, ничтоже сумняшеся, нахрен скрыл его консоль »
:)
Дык, это ведь не powershell виноват в том, что консоль far-а имеет свое, особое мнение и батники с powershell-ом запускает прямо в ней... хотя, так работает любая консоль, такшта и фар тут тоже, особо не виноват... :)
Но, всё же, это правильно, имхо, т.к. целью, как раз, было скрыть консоль, чтобы глаза не мозолила.
Ну и в крайнем случае, можно ведь powershell в отдельном окне запускать, через start...
А если так: »
О, спасибо!
Оказывается есть вариант... я-то потыкал гугль, но на глаза не попалось ничего аналогичного, а усиленно рыть не стал.

Iska
28-08-2018, 21:56
Дык, это ведь не powershell виноват в том, что консоль far-а имеет свое, особое мнение и батники с powershell-ом запускает прямо в ней... хотя, так работает любая консоль, такшта и фар тут тоже, особо не виноват...
Но, всё же, это правильно, имхо, т.к. целью, как раз, было скрыть консоль, чтобы глаза не мозолила. »
Проблема в том, что по завершении процесса powershell.exe последний не восстанавливает исходное состояние окна консоли.

YuS_2
28-08-2018, 22:36
Проблема в том, что по завершении процесса powershell.exe последний не восстанавливает исходное состояние окна консоли. »
Кстати, откопал, среди хлама, ватчдог слежения за каталогом, который когда-то делал... вот ведь память старческая моя, там ведь есть messagebox аналогичный, с опциями [Windows.Forms.MessageBoxOptions]::ServiceNotification... :)
И там же есть запуск скрытых консолей powershell и он там именно через батник с командами start "", так что вполне себе вариант, т.к. консоль из которой происходит запуск, остается нетронутой. И на всякий случай, там же, есть скрипт прибития скрытых консолей:
$p = get-wmiobject win32_process -filter "name='powershell.exe'"|%{if($_.commandline -match 'hid'){$_.processid}}
kill -id $p

DJ Mogarych
30-08-2018, 11:33
Какой ужас.
Извините за оффтоп, но не пытались ли разобраться с тем, почему вообще программа вылетает?
Зачем вообще нужно это взаимодействие с пользователем и запуск руками чего бы то ни было, если нужно, чтобы программа всегда работала?




© OSzone.net 2001-2012