使用 VBScript 自动提取证书元数据的 Java keytool 命令不起作用

问题描述

使用 Java keytool 实用程序,我尝试从两个可能的目录自动读取附加到 JKS 文件中证书的元数据,并将元数据输出到平面文件(全部来自 Windows Server 2012 VM)。我正在使用这个命令语法:

E:\Java\jre8\bin\keytool -list -v -keystore E:\foo\foo_trusts.jks > F:\foo_trusts.txt

警告:手动执行此过程时,我需要在密码提示下按 Enter 键才能完成 keytool 执行。遵循 Windows 命令行中的手动方法时,始终在 F 驱动器中生成所需的输出

这是我尝试使用的 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:\Java\jre8\bin\keytool -list -v -keystore E:\foo\foo_trusts.jks > F:\foo_trusts.txt"
    WScript.Sleep 5000
    WshShell.SendKeys "{ENTER}"
    WScript.Sleep 30000
ElseIf objFSO.FolderExists(strDirectory2) Then
    WshShell.Run "E:\Java\jre8\bin\keytool -list -v -keystore E:\bar\bar_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 中遗漏了某些东西,或者我做错了什么,从而阻止了预期的执行?

解决方法

我确定了解决方案。 WshScriptRun 对象通常不能从任务执行中读取标准输出。但是,通过在运行字符串的开头添加“cmd /c”,我能够在 F 驱动器中获得所需的输出。

WshShell.Run "cmd /c E:\Java\jre8\bin\keytool -list -v -keystore E:\foo\foo_trusts.jks > F:\foo_trusts.txt"