-
Добрый день. Где я накосячил? Win8x64, Delphi XE3 Есть скрипт на vbs, выполняющий определенную работу и выводящий результат на экран. если я в командной строке наберу cscript.exe myscript.vbs > result.txt то в папке со скриптом появиться файл result.txt, однако, если я пытаюсь выполнить команду программно, то ничего не происходит: var
ScriptFile, ResultFile: string;
begin
ScriptFile := GetEnvironmentVariable('TMP') + '\cdump.vbs';
ResultFile := GetEnvironmentVariable('TMP') + '\cdump.txt';
ShellExecute(0, 'open', PChar('cscript.exe'), PChar('\"' + ScriptFile + '\" > \"' + ResultFile + '\"'), nil, 0);
end; причем код выполняется от имени админа, где я накосячил?
-
пробовал внутри скрипта прописать set FSO=CreateObject("Scripting.FileSystemObject")
set file =FSO.CreateTextFile("cdump.txt")
file.WriteLine("test")
file.Close бесполезно, такое ощущение, что скрипт вообще не запускается, хотя cscript в памяти на мгновение появляется
-
> AlekVolsk (04.06.13 23:16)
ShellExecute это не cmd.exe
-
Пуск->Выполнить тоже не cmd.exe, и командная строка в тотале также cmd.exe не является, однако там все работает, а ShellExecute - нет :(
-
То, что в некоторых случаях > работает как перенаправление потока — не более чем соглашение. Как уже сказали, нужно выполнять %comspec% /c cscript "ScriptFile" > "ResultFile" , тогда сработает. Или переписать скрипт, чтобы принимал имя выходного файла и действовал сообразно.
-
>[4] не работает, похоже, cscript это не консольное приложение, во всяком случае ряд функций генерит вполне реальный gui
-
выяснил следующее. в скрипте есть код: Set WshShell = CreateObject("WScript.Shell")
regKey = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
DigitalProductId = WshShell.RegRead(regKey & "DigitalProductId")
так вот, из проводника все запускается нормально, при попытке открыть программно выдает в консоль: WshShell.RegRead: Не удается открыть для чтения раздел реестра "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId". Не хватает прав? каких?
-
> Не хватает прав? каких? Мне кажется, проблема скорее с битностью. Из эксплорера запускается 64-битный cscript, программно — 32-битный, соответственно, смотрят в разные ветки реестра.
-
возможно, допускаю. а как в таком случае задать права доступа к реестру из скрипта, аналогично Regystry.Access := KEY_READ or KEW_WOW64_64KEY; в delphi (понимаю, что вопрос уже не по delphi, но все же, а вдруг кто знает?)?
-
ну я бы попробовал принудительно запускать 64-битный cscript, который из эксплорера запускается
-
помогло, запускал %systemroot%\sysnative\cscript "ScriptFile" . огромная благодарность за помощь!
-
> %systemroot%\sysnative\cscript Это "псевдокод" или особенность восьмой винды? У меня под семёркой никакого sysnative нету, надо бы поосторожней.
-
да, псевдокод, поддержка которого реализована самой виндой. это особенность 64-разрядной винды для 32-разрядных приложений: %systemroot%\sysnative\ - 64-разрядные библиотеки, по факту лежащие в %systemroot%\system32\ %systemroot%\system32\ - 32-разрядные библиотеки, по факту лежащие в %systemroot%\SysWOW64\ источник: журнал blasepascalmagazine #4, статья Александра Алексеева "В ожидании x64: WOW64"
|