我试图将所有CA证书导出到Base64格式的目录,我是powershell的新手,因为我以前习惯用bash编写脚本。不知怎的,我没有看到一些感觉应该是显而易见的东西。
这是我到目前为止的路线,
@(Get-ChildItem -path Cert:\Localmachine\ca).ForEach({Export-Certificate -Type CERT -FilePath "C:\ssl\certs.d\$_.Thumbprint" -Cert "Cert:\LocalMachine\ca\$_.Thumbprint"})
我很感激任何帮助,因为我正试图学习如何在PS4中成为惯用语。
答案 0 :(得分:2)
这行代码包含3个问题:
<强>首先。使用object属性进行字符串插值。 PS解析器无法理解"$var.Property"
,它只能理解“string”中的$expression
。但由于它是表达式,而不仅仅是变量名,因此您可以使用"$(something to evaluate)"
来评估您的行。换句话说,您的-FilePath
应为:
-FilePath "C:\ssl\certs.d\$($_.Thumbprint)"
<强>二。使用对象。下面的PS是完整的.Net Framework。即使许多对象以简单的预定义方式在输出中表示,实际上它们也可以作为完整的活动对象输出。根据{{3}},-Cert
参数是<Certificate>
,而不是指向证书的字符串,因此您的-Cert
应该只是
-Cert $_
<强>第三。下面的数组。 Get-ChildItem
只是MSDN,它返回一个对象数组。理想情况下,您不需要用任何东西包装它,并且可以简单地将其进一步管道化(Get-ChildItem | Foreach-Object{...}
)。但是很多人对PS语法有不同的品味,所以(gci).ForEach({...})
(没有@)的形式也有权生活。但是你正在以@(...)
的形式做的是创建一个项目的新数组,作为gci
返回给你的数组。从技术上讲,它应该不起作用。但是,因为PS会自动避免这样的错误:在PS中,您可以使用与此项目相同的方式处理1项目的数组(除非明确指出相反)。为了说明,
@(4).Length # returns 1
@(@(2,3)).Length # returns 2
@(,@(2,3)).Length #returns 1
因此,您Get-ChildItem
的当前语法容易出错,并依赖于自动PS错误处理糖。我建议您在开头删除@
,或者以
Get-ChildItem -...... | Foreach-Object {...}