我遇到了以下奇怪的行为,我希望有人可以向我指出一些文档,这些文档可以解释为什么发生这种现象或导致这种现象的原因。
我尝试查看New-SelfSignedCertificate
的文档,以查看是否有注释说明此问题或是否有一个参数“迫使”它完成但没有发现有用的东西。 https://docs.microsoft.com/en-us/powershell/module/pkiclient/new-selfsignedcertificate?view=win10-ps
我还尝试在Google上搜索OutVariable vs分配,但也没有发现任何帮助。
请考虑以下功能:
function Why-DoesThisFail {
$cert = New-SelfSignedCertificate -Type Custom -Subject "CN=test" -KeyAlgorithm "RSA" -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" -NotAfter (Get-Date).AddDays(1) -KeySpec Signature `
-KeyExportPolicy NonExportable;
# Note that this outputs fine.
Write-Host $cert.Thumbprint;
# Prints nothing
Get-ChildItem -Path "Cert:\CurrentUser\My\$cert.Thumbprint";
}
function Why-DoesThisPass {
New-SelfSignedCertificate -Type Custom -Subject "CN=test" -KeyAlgorithm "RSA" -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" -NotAfter (Get-Date).AddDays(1) -KeySpec Signature `
-KeyExportPolicy NonExportable -OutVariable cert;
# Note that this outputs fine.
Write-Host $cert.Thumbprint;
# Prints Cert as expected
Get-ChildItem -Path "Cert:\CurrentUser\My\$cert.Thumbprint";
}
请注意,这两个函数之间的唯一区别是一个函数使用变量分配,另一个函数使用OutVariable
。这是Powershell本身在处理OutVariable与Assign方面的行为吗?还是因为New-SelfSignedCertificate
在幕后进行的操作?感觉好像好像New-SelfSignedCertificate
完成之后才在计算机上注册证书,并且在使用变量分配时由于某种原因证书没有完成。请注意,在函数完成并将控制权返回给Powershell之后,您可以成功运行最后一行(用从Write-Host写入的指纹替换指纹)并从计算机检索证书。
我很困惑。
感谢您的帮助!
答案 0 :(得分:3)
您的问题,对此没有任何困惑或背景吗?
-OutVariable和变量分配?
这是因为您在第一个错误中使用了该行。双引号确实会强制变量扩展,但是在您的情况下,您需要更改该点缀的$ cert变量的字符串插值。因此,您对字符串扩展有误解。
这个...
Get-ChildItem -Path "Cert:\CurrentUser\My\$cert.Thumbprint";
...应该以这种方式完成。
Get-ChildItem -Path "Cert:\CurrentUser\My\$($cert.Thumbprint)"
...否则,PowerShell不知道它是什么。另外,在PowerShell适当中根本不需要这些分号。它是一个特殊的标记,用于分隔不同的代码段。如果您将所有内容全部放在一行上,那很重要,但这里没有您的用法。
如果您在ISE或VSCode中执行此操作,则会看到颜色编码更改,以反映将要扩展的内容和将不会扩展的内容。
请参阅本文。 Powershell String Expansion
可变插值,或两种类型的字符串单个字符串 引号(')是文字字符串,表示没有特殊含义 字符字符串中的每个字符都将作为自身输出。 Powershell中带有双引号(“)的字符串将扩展变量,并且 转义字符串中的字符;这称为 插值。
尽管它与Here-Strings进行了交流,但它仍然涵盖了我试图在此处提出的要点。
Variable expansion in strings and here-strings
现在关于您的帖子问题...
-OutVariable和变量之间是否存在功能差异 作业?
...两者的发送结果相同。但是,这是交易... 您可以将命令的输出存储在变量中,同时将此输出显示在屏幕上。这也是Out-Variable的功能,而变量赋值不输出。但是,如果使用变量压缩,它可以。所以,这个...
Get-ChildItem -OutVariable files
...这个...
($files = Get-ChildItem)
...将执行相同的操作。将结果分配给变量,并同时输出到屏幕。
查看此- 3 ways to store and display PowerShell Variable simultaneously
使用-OutVariable参数
使用PowerShell压缩变量
Tee-Object Cmdlet
最后,除非要进行文本屏幕着色,否则请避免使用Write-Host。默认情况下,PowerShell将输出到屏幕,除非另有说明。所以,这个
Write-Host $cert.Thumbprint
Write-Host 'Hello'
...还有这个...
$cert.Thumbprint
'Hello'
...会做同样的事情。
如果由于您选择的编码习惯而必须使用Write- *,请选择Write-Output。
Andrei Odegov点/指针的更新
是的,他们只是向屏幕输出问候。尝试一下。
Write-Host 'hello'
# results
hello
'Hello'
# results
Hello
至于您的链接...
您最后一次声明Write-Host“ Hello”和“ Hello”相同吗 事情,对吗?看看stackoverflow.com/questions/8755497/…
...这些都做同样的事情。输出到屏幕。
$count = 5
write-host "count=" + $count
# results
count= + 5
write-host "count = $count"
# results
count = 5
"count = $count"
# results
count = 5
"count=" + $count
# Results
count=5
第一个就是为什么字符串连接会出现问题。我不是唯一这样认为的人。观看此视频。
摘自《 The PowerShell Gotcha's》大书
不要连接字符串
https://devops-collective-inc.gitbook.io/the-big-book-of-powershell-gotchas
https://www.youtube.com/results?search_query=don%27t+concatenate+string