我正在尝试在Powershell中编写一些keytool包装器来管理密钥库。 我面临的问题是,在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 Stop似乎使标准的ouptut重定向消失了。
答案 0 :(得分:3)
我不确定我是完全理解它是如何工作的,但经过大量的猴子测试后#34;我现在有我想要的东西:
$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作为errorvariable故意,上面的代码就是这样,发送我认为应该是标准输出的错误,并将错误发送到标准输出。
然后我在脚本中使用逻辑来确定成功或失败。 我希望这有助于那里的人,我希望有人解释为什么我刚刚发现的东西。
答案 1 :(得分:0)
请勿在Powershell ISE中执行此操作。使用常规的Powershell。