2016-11-02 7 views
0

Я пытаюсь сделать функцию, которая выполняет команды, как это:CreateObject («Wscript.Shell») во всем мире не работает

Set fso = CreateObject ("Scripting.FileSystemObject") 
Set stdout = fso.GetStandardStream (1) 
print runCommand("git --help") 

function runCommand(commandStr) 
    set objShell = CreateObject("Wscript.Shell") 
    Set objExec = objShell.Exec(commandStr) 

    Do Until objExec.Status 
     Wscript.Sleep 10 
    Loop 

    runCommand = objExec.StdOut.ReadAll() 
end function 

sub print(str) 
    stdout.WriteLine str 
end sub 

Это прекрасно работает, но я хочу использовать objShell на более высоком уровень, поэтому я решил сделать objShell глобальными:

set objShell = CreateObject("Wscript.Shell") 
Set fso = CreateObject ("Scripting.FileSystemObject") 
Set stdout = fso.GetStandardStream (1) 
print runCommand(objShell.CurrentDirectory) 
print runCommand("git --help") 

function runCommand(commandStr) 
    Set objExec = objShell.Exec(commandStr) 

    Do Until objExec.Status 
     Wscript.Sleep 10 
    Loop 

    runCommand = objExec.StdOut.ReadAll() 
end function 

sub print(str) 
    stdout.WriteLine str 
end sub 

Однако, теперь, когда я запускаю его я получаю сообщение об ошибке:

WshShell.Exec: Access is denied. 

И я t ссылается на строку set objShell = CreateObject("Wscript.Shell"). Если я попытаюсь сделать две разные переменные objShell и objShell2, я получаю ту же ошибку. Как это разрешить?

+0

В этом случае вам нужно избавиться от «set objShell = CreateObject (« Wscript.Shell »)» в начале функции! Не делайте этого дважды! – duDE

+0

@duDE жаль, что это был тип-о. удален. Поведение все еще терпит неудачу. И я пропустил функцию печати, которую я также добавил. –

ответ

3

Мне удалось реплицировать вашу проблему локально. Я обнаружил, что область действия WScript.Shell не виновата.

Попробуйте это, и это, скорее всего, будет работать (обратите внимание на прокомментированную строку);

set objShell = CreateObject("Wscript.Shell") 
Set fso = CreateObject ("Scripting.FileSystemObject") 
Set stdout = fso.GetStandardStream (1) 
'print runCommand(objShell.CurrentDirectory) 
print runCommand("git --help") 

function runCommand(commandStr) 
    Set objExec = objShell.Exec(commandStr) 

    Do Until objExec.Status 
     Wscript.Sleep 10 
    Loop 

    runCommand = objExec.StdOut.ReadAll() 
end function 

sub print(str) 
    stdout.WriteLine str 
end sub 

Ошибка Access Denied по-видимому, связана с вызовом objShell.CurrentDirectory.

Проблема заключается в том, что вы пытаетесь передать текущий каталог objShell.Exec(), и он не знает, как его выполнить. (в конце концов это не приложение).

Вот пример в его простейшей форме;

CreateObject("Wscript.Shell").Exec("C:\") 

Выход:

WshShell.Exec: Access is denied. 

Если вы просто хотели, чтобы вывести текущий каталог, используя ваш скрипт, который вы, вероятно, хотел использовать

print objShell.CurrentDirectory 

вместо этого.

+1

ах ... да, это работает! Я думаю, что я делаю что-то немое ... Я пытаюсь использовать вывод objShell.CurrentDirectory в своей функции вызова, и я думаю, что здесь должно быть задействовано двойное использование ресурсов. Я разделил это сейчас, и он отлично работает:). Сложно с достойной IDE: o –

+0

@code_fodder да, где вы пытаетесь передать 'objShell.CurrentDirectory' через вашу функцию' runCommand() ', которая будет ошибочной как' objShell.Exec() 'не будет знать, что делать с Это. – Lankymart

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