2016-09-05 4 views
1

Я пытаюсь получить результат из сценария PowerShell, который я написал.Скрипт Powershell всегда возвращается 0 через HTA

Test.ps1

Get-Process 

VBScript в ОМТ кодируется следующим образом:

Sub Test() 
    cmd = "powershell.exe -noprofile -command .\test.ps1; exit $LASTEXITCODE" 
    Set shell = CreateObject("WScript.Shell") 
    Set executor = shell.Exec(cmd) 
    executor.StdIn.Close 
    MsgBox executor.StdOut.ReadAll 
End Sub 

Когда я пытаюсь эту cmd строку в командной строке она работает perferctly. Но окно сообщения всегда появляется с пустым пространством.

Каков наилучший способ исправить это?

ответ

1

Скорее всего test.ps1 не находится в рабочем каталоге запуска VBScript, поэтому он не найден и, следовательно, не выполнен. Если у вас есть VBScript и PowerShell скрипт в том же каталоге, что лучше построить путь PowerShell скрипт с пути VBScript:

Set fso = CreateObject("Scripting.FileSystemObject") 
dir = fso.GetParentFolderName(WScript.ScriptFullName) 
psscript = fso.BuildPath(dir, "test.ps1") 

Затем вы можете построить командную строку, как это:

cmd = "powershell.exe -NoProfile -File """ & psscript & """" 

Дополнительные двойные кавычки должны содержать пробелы в пути. Я также рекомендую использовать параметр -File вместо свернутого -Command "...; exit $LASTEXITCODE".


В качестве альтернативы (если вы хотите придерживаться запуска сценария PowerShell из текущего рабочего каталога) можно также изменить каталог в вашем скрипте:

Set fso = CreateObject("Scripting.FileSystemObject") 
Set sh = CreateObject("WScript.Shell") 

sh.CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName) 

... 
cmd = "powershell.exe -NoProfile -File .\test.ps1" 

Edit: HTAs имеют разную среду выполнения, чем обычные VBScripts. Двигатель HTA не предоставляет объект WScript, поэтому WScript.ScriptFullName не работает в HTA. Вы можете, однако, определить каталог сценария из расположения документа:

Set fso = CreateObject("Scripting.FileSystemObject") 
dir = fso.GetParentFolderName(Replace(document.location.href, "file:///", "")) 
psscript = fso.BuildPath(dir, "test.ps1") 

Если вы хотите, чтобы канонизировать разделителей пути к обратной косой черты вы можете сделать это либо, как это:

psscript = fso.BuildPath(Replace(dir, "/", "\"), "test.ps1") 

или как это:

psscript = fso.BuildPath(fso.GetFolder(dir).Path, "test.ps1") 
+0

Спасибо! но теперь он говорит, что требуется объект WScript.ScriptFullName. – user3503676

+0

Итак, вы не используете код VBScript с 'cscript.exe' или' wscript.exe'. Какова ваша среда исполнения VBScript? –

+0

Я запускаю VBScript через HTA onClick = "Test()" обработчик событий javascript – user3503676

1

В этом вопросе та же проблема обсуждалась: Get Output of a PowerShell Script in a HTA

Решение заключалось в том, чтобы написать вывод в сценарии powershell в текстовый файл, а в HTA прочитать вывод из этого текстового файла и отобразить его с помощью MsgBox.

Возможно, это решение для вас тоже.

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