Что нового

Запуск файла конкретной программой. (ввод/вывод cmd)

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Всем доброго времени суток....
Никак не мог подумать что на данном этапе возникнут проблемы, но они возникли.
Обобщенно мне необходим механизм, который сродни функционалу explorer "Открыть с помощью"
Я уже предвкушаю Ваше мнение - аля:
"Это уже 1000 раз обсуждалось, RTFM :mad:, Run() и ShellExcute() тебе в помощь!" :laugh:
Но спешу Вас заверить это не так. :scratch:
Я замечательно знаком, и часто использую те самые Run() и ShellExcute, но в данном конкретном случае я никак не могу выкрутиться.
И так что-же мы имеем:
1)Довольно популярную программу для организации удаленного доступа UltraVNC, а именно ее клиентскую часть vncviewer.exe,
так же, мы имеем ряд файлов *.vnc, данные файлы являются набором предустановленных параметров для подключения сродни ялыкам которые можно создать для подключения к удаленному раб.столу.
2)Каталог со скриптом в котором имеем ряд дочерних каталогов, а именно:
\Client\ - в котором мы расположили саму программу-клиент vncviewer.exe
\vnc\ - каталог с набором таких вот *.vnc файлов

Задача: запускать конкретный файл из каталога \vnc\ , программой \Client\vncviewer.exe

Допустим, каталог со всем нашим добром это D:\Test\ (далее я экспериментирую с абсолютными путями, хотя хотелось бы с относительными)

Внимание: Безусловный казус разработчиков UltraVNC заключается в том, что запуск клиента в параметры которому передается путь к *.vnc файлу, судя по всему не предусмотрен :smile:, т.е. следующие действия в консоли:
Код:
D:\Test\Client\vncviewer.exe D:\Test\vnc\someLNK.vnc
приводит к ошибке со стороны клиента... краткой справке по параметрам командной строки, и отфутболивание в доку...
в доке же, не обозначен ни один полезный нам аргумент, за исключением -register который вроде как регистрирует в системе тип файла "VNC" (что безусловно требует ад минских привилегий...) вот собственно офф.док
При всем при этом следующие действия в консоли
Код:
start D:\Test\vnc\someLNK.vnc D:\Test\Client\vncviewer.exe
Приводят к должному эффекту, как собственно и открытие файла если мы все таки ассоциировали его с vncviewer.exe
Дает требуемый результат...
Что я только не перепробовал:
Код:
$vncViewer = @ScriptDir & "\Client\vncviewer.exe"
$vncLNK = @ScriptDir & "\Client\someLNK.exe"

Run($vncViewer & " " & $vncLNK) ; ну здесь та самая байда с ошибкой
ShellExcute($vncViewer, $vncLNK) ; тишина
Run("start " & $vncLNK & " " & $vncViewer) ; тишина

; решил попробовать через CMD
Run(@WindowsDir & "\system32\cmd.exe " & " start " & $vncLNK & " " & $vncViewer)
ShellExcute(@WindowsDir & "\system32\cmd.exe",  "start " & $vncLNK & " " & $vncViewer)

;и даже пробовал через поток ввода вывода
$cmd = Run(@WindowsDir & "\system32\cmd.exe)
StdinWrite($cmd, start " & $vncLNK & " " & $vncViewer)


Все в пустую...
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
К сожалению такого формата запись:
Код:
"$vncViewer"

не даст тебе значение переменной $vncViewer :smile:
Скорее всего просто не доглядел ты...
Код:
Run("start " & $vncLNK & " " & $vncViewer)

Должно сработать.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
RUVATA
пару раз перечитал и не понял проблему.
если в комстроке срабатывает
RUVATA [?]
start D:\Test\vnc\someLNK.vnc D:\Test\Client\vncviewer.exe
то почему не использовать , к примеру ,
Код:
_RunDos('start D:\Test\vnc\someLNK.vnc D:\Test\Client\vncviewer.exe')

если срабатывает ассоциирование файлов параметров с программой, то далее можно и без комстроки обходиться.
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Nik_rus [?]
К сожалению такого формата запись:
Нет, это я в примере ошибся... В реальном коде там все нормально...
Код:
Run("start " & $vncLNK & " " & $vncViewer)
ни чего не дает...

Александр [?]
если в комстроке срабатывает
Я не знаю причин но
Код:
_RunDos('start D:\Test\vnc\someLNK.vnc D:\Test\Client\vncviewer.exe')

тоже не срабатывает.

Я выкрутился следующим образом, я создал еще один скрипт и скомпилил его в апп принемающий параметрами то что нужно открыть и чем, фактически дубль "Открыть с помощью", ну из кода вобщем-то все ясно
Код:
$hFile = FileOpen(@ScriptDir & '\OpenAs.cmd', 2)
$sCode = "start " & $CmdLine[1] & " " & $CmdLine[2]
FileWrite($hFile, $sCode)
FileClose($hFile)
ShellExecute(@ScriptDir & '\OpenAs.cmd')
Sleep(500)
FileDelete(@ScriptDir & '\OpenAs.cmd')

И обращаюсь к этой подпрограмме из основного кода.
Вот только так получилось добиться результата.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
чтобы не использовать
Код:
Sleep
можно использовать
Код:
ShellExecuteWait

мне так кажется
 
Верх