Java keytool.exe powershell包装不会压制标准错误

问题描述:

我想在Powershell中编写一些keytool包装来管理密钥库。 我现在面临的问题是,在PowerShell中,运行类似命令时:Java keytool.exe powershell包装不会压制标准错误

$cmd = "& " + $keytoolexe + " -import " + $CAswitch + 
" -alias " + $alias + 
" -keystore " + $keystore + " -storepass " + $storepass + 
" -file "  + $file + 
" -noprompt *>&1" 
$result = Invoke-Expression -Command $cmd 

正如你可以看到我重定向一切标准ouptut,因为我想存储在一个变量来评估命令的结果。

问题是,当keytool.exe返回一个成功的消息时,PowerShell以某种方式读取它作为错误。

我试图运行块代码本身,我没有得到任何错误。 但是,当我把这段代码放到一个函数中,并且我用参数-ErrorAction stop来调用函数后,我得到了这个错误。

keytool.exe : Certificate was added to keystore 
At line:1 char:1 
+ & "C:\Program Files\Emulex\OCM for VMware\JRE\bin\keytool.exe" -impor ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (Certificate was added to keystore:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

因此,不知何故ErrorAction停止似乎使标准ouptut重定向消失。

我不知道我完全理解,它是如何工作的,但很多“猴子测试”后,我现在有什么我要找:

$cmd = "& " + $keytoolexe + " -import " + $CAswitch + 
" -alias " + $alias + 
" -keystore " + $keystore + " -storepass " + $storepass + 
" -file "  + $file + 
" -noprompt *>&1" 
$dummy = Invoke-Expression -Command $cmd -ErrorVariable KeyToolStdOut -OutVariable KeyToolStdErr -ErrorAction Continue 

不知怎的,它似乎重定向一切的结合标准ouptut(*> & 1),然后使用变量来捕获标准输出和标准错误工作。

是的,我把标准ouptut作为故意变化的目的,上面的代码,就是这样,发送我认为应该是标准输出的错误,并将错误发送到标准输出。

然后,我在脚本中使用逻辑来确定成功或失败。 我希望这可以帮助那里的人,我希望有人解释为什么我刚刚发现的作品。