powershell混淆了数组循环,foreach方法,字符串?

时间:2016-09-23 23:37:37

标签: powershell ssl-certificate powershell-v4.0

我试图将所有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中成为惯用语。

1 个答案:

答案 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 {...}