问题描述
使用 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"