我有一個 Pester It 塊,如下所示:
It "should add a header" {
{
$DifferenceObject = Get-Content -Path $PathToFile1
Set-PowershellFile -Path $PathToFile2
$ReferencedObject = Get-Content -Path $PathToFile2
Compare-Object -ReferenceObject $ReferencedObject -DifferenceObject $DifferenceObject | should -be $null
}
}
Set-PowershellFile 只是用一些新文本更新檔案。我認為上面的代碼會執行以下操作,但我只想確認:
- 它獲取位于“PathToFile1”的檔案的內容
- 它使用 Set-PowershellFile 將檔案設定為“PathToFile2”,然后獲取該檔案的新內容。
- 將新更新的檔案與第一個檔案的內容進行比較,確保它們相同。
它是否正確?當我運行單元測驗時,在 Set-PowershellFile 中所做的檔案更改不會持續存在,但單元測驗通過了。我假設將此代碼包裝在 {} 中的 if 塊中會導致同步行為,但不會“提交”檔案更改。這一切都正確嗎?
uj5u.com熱心網友回復:
Mathias R. Jessen在評論中提供了關鍵指標 - 只需省略內部{和}- 但由于我之前已經看到了潛在的誤解,因此值得深入挖掘:
雖然{ ... }塊是大多數 PowerShell 陳述句的常規部分,例如foreachand if,但它們不提供立即執行的范圍陳述句塊,例如它在 C# 中的作業方式。
相反,{ ... } 隔離是 PowerShell腳本塊的文字形式,即稍后執行的陳述句塊,根據需要&,通過呼叫運算子,用于在子范圍內.執行,或通過點源運算子,直接在源范圍內執行- 這可能是也可能不是呼叫者的范圍(請參閱下面的警告)。
因此,這樣的腳本塊文字必須要么保存在變數中,要么傳遞給需要腳本塊的命令,以便稍后執行。
如果沒有,腳本塊會隱式輸出到成功輸出流,默認情況下會輸出到控制臺(主機),導致它按其.ToString()值呈現,該值只是腳本塊的逐字內容,不包括分隔符 ({和})。
例如:
# Script block literal is output by its *verbatim content* (without delimiters)
PS> { "Honey, I'm $HOME" }
"Honey, I'm $HOME"
為了正確使用腳本塊,您必須執行它,通常使用&:
# `& ` executes in a child scope of and
# `. ` executes directly in the scope of origin, typically the current scope.
PS> & { "Honey, I'm $HOME" }
Honey, I'm C:\Users\jdoe # e.g.
警告:
腳本塊文字- 與構建的腳本塊不同 - 與[scriptblock]::Create('...')定義它們的范圍域(也稱為“會話狀態”)相關聯。
這意味著:
在模塊外部定義的腳本塊文字,當也從模塊外部呼叫時,確實在 () 的子范圍內
&/直接在 (.)呼叫者的范圍內運行。相比之下,在模塊內定義的腳本塊文字與該模塊的作用域域相關聯,這意味著呼叫(無論呼叫來自何處)都在該模塊的頂級作用域(with
.)或其子作用域中執行(與&)。
例子:
PS> $foo = 1; function Get-ScriptBlock { ( $foo) }; . Get-ScriptBlock
2
也就是說,在呼叫的非模塊范圍域中創建的腳本塊. 直接在非模塊呼叫者的范圍內運行。
PS> $foo = 1; $null = New-Module { $foo = 99; function Get-ScriptBlock { ( $foo) } }; . Get-ScriptBlock
100
That is, the script block created in the scope domain of the dynamic module created with New-Module, invoked with . , ran in that module's top-level scope, even though it was invoked from a non-module caller.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/444153.html
標籤:电源外壳 单元测试 powershell-3.0 powershell-4.0 纠缠
