2013-12-03 3 views
1

Я пытаюсь запустить программу Go vbscript, которая добавляет несколько значений реестра. Код Go, который обрабатывает это выглядит следующим образом:Выполнение vbscript в Go

err = exec.Command("cmd.exe", "/c", "registry.vbs").Run() 
if err != nil { 
    fmt.Printf("Error: %s\n", err.Error()) 
} 

Когда я запускаю свою программу Go и он попадает в ту часть, где он выполняет эту VBScript абсолютно ничего не происходит. Значения реестра не изменяются и ошибок нет. Если я пытаюсь запустить следующую команду он работает просто отлично:

cmd.exe /c C:\path\to\file\registry.vbs 

Вещи, которые я попробовал:

  • Добавить путь к файлу в программе Go
  • Запустите программу Перейти в качестве администратора
  • Я попытался использовать .Output() вместо .Run(), в результате чего результат был равен [ ]

Есть ли у кого-нибудь идеи, почему это происходит?

Любое направление будет принята с благодарностью.

ответ

5

Есть так много вещей, которые могут пойти не так в вашем сценарии, что вы должны начать просто:

(1) дано .vbs, что делает не попыток изменить реестр (который для Windows с нетерпением защищающей):

MsgBox "ThatsMe" 

и призывание

err := exec.Command("cmd.exe", "/c", "ThatMe.vbs").Run() 

из EXE-файл в той же папке, я получаю предупреждение о безопасности: «Вы действительно хотите открыть ThatsMe.vbs из подключенного сетевого диска E: \». Если я согласен, скрипт выполняется и появляется MsgBox. Настройки безопасности могут быть настолько строгими, что вас даже не спрашивают.

(2) Для выполнения вышеуказанного вызова на работу оболочка должна знать, как обращаться с файлами .VBS. Настройки вашего соединения/ftype могут не предоставлять эту информацию.Тогда

err := exec.Command("wscript.exe", "ThatsMe.vbs").Run() 

или

err := exec.Command("cscript.exe", "ThatsMe.vbs").Run() 

должен работать - интересно без предупреждения безопасности.

(3) Вместо того, чтобы полагаться на PATH и с/делать все файлы/работу в той же папке, provinding полных спецификаций файлов может быть хорошей идеей:

err := exec.Command(
    "C:/WINDOWS/system32/wscript.exe", 
    "E:/trials/SoTrials/answers/10024850/go/ThatsMe.vbs").Run() 

(4) Если вы можете выполнить смиренный ThatsMe.vbs, но ваш registry.vbs все равно не работает, тогда вам нужно исследовать, кому разрешено видеть/изменять части реестра, которые вас интересуют. Возможно, вам нужно вызвать ваш исполняемый файл в качестве администратора.

(5) Во время экспериментов я получил довольно приличные сообщения об ошибках от Go для (un) предназначенных мерзких вещей, которые я пробовал (используя% comspec% вместо cmd.exe, плохие спецификации файла, ...). Но попытка прочитать несуществующий элемент реестра вызвала всплывающее сообщение об ошибке Windows Script Host и no Ошибка Go. Таким образом, ваш «абсолютно ничего не происходит» диагноз заставляет меня задаться вопросом, скрывает ли Windows от вас сообщения об ошибках. Существуют темные опции, такие как «Отображать уведомление о каждой ошибке скрипта» в настройках IExplorer Advanced.

+0

Вызывается с помощью 'cscript.exe' в сочетании с функцией, которую я нашел по адресу http://stackoverflow.com/questions/14763625/i-have-issue-with-shell-regwrite-on-windows-8, чтобы вызвать UAC разрешили проблему. Спасибо за помощь. – Peter

3

Попробуйте использовать Cscript.exe вместо cmd.exe.

Cscript.exe - это версия командной строки Windows Script Host, предоставляющая параметры командной строки для установки свойств сценария.

Чтобы получить выход, используйте Output() вместо Run().

Полный пример:

package main 

import (
    "fmt" 
    "os/exec" 
) 

func main() { 
    if out, err := exec.Command("Cscript.exe", "registry.vbs").Output(); err != nil { 
     fmt.Printf("Error: %s\n", err) 
    } else { 
     fmt.Printf("%s\n", out) 
    } 
} 

См "To run scripts using the command-line-based script host (Cscript.exe)" на TechNet.

0

Другой подход заключается в том, чтобы сделать Windows run the default application для вашего файла .vbs. Обычно это будет wscript.exe.

Смежные вопросы