-OutVariable和变量分配之间在功能上有区别吗?

时间:2019-06-01 04:31:31

标签: powershell

我遇到了以下奇怪的行为,我希望有人可以向我指出一些文档,这些文档可以解释为什么发生这种现象或导致这种现象的原因。

我尝试查看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写入的指纹替换指纹)并从计算机检索证书。

我很困惑。

感谢您的帮助!

1 个答案:

答案 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