Автоматизация команды Java keytool с использованием VBScript для извлечения метаданных сертификата не работает

#vbscript #keytool #wsh

#vbscript #keytool #wsh

Вопрос:

Используя утилиту Java keytool, я пытаюсь автоматизировать чтение метаданных, прикрепленных к сертификатам в файле JKS, из двух возможных каталогов и выводить метаданные в плоский файл (все с виртуальной машины Windows Server 2012). Я использую этот синтаксис команды:

 E:Javajre8binkeytool -list -v -keystore E:foofoo_trusts.jks > F:foo_trusts.txt
 

Предостережение: при выполнении этой процедуры вручную мне нужно нажать клавишу ввода в запросе пароля, чтобы завершить выполнение keytool. Желаемый результат всегда создается на диске F при следовании ручному подходу из командной строки Windows.

Вот код VBScript, который я пытаюсь использовать (включая код для эмуляции нажатия клавиши Enter):

 Option Explicit
Dim objFSO
Dim strDirectory, WshShell

strDirectory = "E:foo"
strDirectory2 = "E:bar"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")

If objFSO.FolderExists(strDirectory) Then
    WshShell.Run "E:Javajre8binkeytool -list -v -keystore E:foofoo_trusts.jks > F:foo_trusts.txt"
    WScript.Sleep 5000
    WshShell.SendKeys "{ENTER}"
    WScript.Sleep 30000
ElseIf objFSO.FolderExists(strDirectory2) Then
    WshShell.Run "E:Javajre8binkeytool -list -v -keystore E:barbar_trusts.jks > F:bar_trusts.txt"
    WScript.Sleep 5000
    WshShell.SendKeys "{ENTER}"
    WScript.Sleep 30000

End If

WScript.Quit
 

Метод автоматизации, который я использую, не поддерживает прямой запуск VBScript, поэтому я использую пакетный файл Windows в качестве оболочки для вызова VBScript. Содержимое пакетного файла довольно простое:

 cscript "E:certMetaExtract.vbs"
 

Когда я запускаю командный файл, я вижу keytool.exe окно появляется и исчезает очень быстро … но больше ничего не происходит. Когда я проверяю диск F на наличие выходных данных из VBScript, их нет.

Есть ли что-то, чего мне не хватает в этом VBScript, или что-то, что я делаю неправильно, что мешает ожидаемому выполнению?

Ответ №1:

Я определил решение. Объект WshScriptRun обычно не способен считывать стандартный вывод при выполнении задачи. НО, добавив «cmd / c» в начало моих строк запуска, я смог получить желаемый результат на диске F.

 WshShell.Run "cmd /c E:Javajre8binkeytool -list -v -keystore E:foofoo_trusts.jks > F:foo_trusts.txt"