[英]Is there a way to tell PowerShell 5 to ignore a piece of code?
我正在嘗試編寫一個 function,如果運行 PowerShell 5.1,它將運行 1 行代碼,如果代碼在 PowerShell 7 中運行,則運行另一行代碼。我遇到的問題是 PowerShell 5.1 甚至不會執行代碼,因為它不知道如何處理? 在三元運算符中。
它返回錯誤“意外的令牌'?' 在表達或陳述中”。
有沒有辦法告訴 PowerShell 5 忽略一段代碼?
這是一個例子:
Function MyTestFunction
{
$Value = 5
if ($PSVersionTable.PSVersion.Major -le 5)
{
if ($Value -eq 5) { "Value is 5" } else { "Value isn't 5" }
}
else
{
$Value -eq 7 ? "Value is 7" : "Value isn't 7"
}
}
我可以通過將其轉換為字符串並使用 invoke-expression 或腳本塊來使其工作。 但這對我來說似乎很草率。 而且它會減慢執行速度。
$String = "'$Value -eq 7 ? '"Value is 7'" : '"Value isn't 7'""
Invoke-Expression -Command $String
& ([scriptblock]::Create($String))
我很確定沒有,但我希望在 PowerShell 5 中有一些我不知道的命令或設置可以讓我告訴 powershell 忽略代碼行
$Value -eq 7 ? "Value is 7" : "Value isn't 7"
當它在 5.1 中運行時,它會編譯並執行。
最好是不需要我轉義或轉換代碼的東西。
這是對您的問題的參考。 判斷powershell的版本
您可以在“PSVersionTable”中使用“PSVersion”object,其中“Major”是檢查版本和調用命令的屬性。 下面修改后的代碼可能與 if-else 語句類似,應該運行 Powershell 5.1 中的第一行代碼,下面版本 7 的代碼應該只在 Powershell 7 上運行。
Function MyTestFunction {
if ($PSVersionTable.PSVersion.Major -le 5) {
if ($Value -eq 5) { "Value is 5" } else { "Value isn't 5" }
}
elseif ($PSVersionTable.PSVersion.Major -eq 7) {
if ($Value -eq 7) { "Value is 7" } else { "Value isn't 7" }
}
}
由於三元運算符 '? :' 在 Powershell 之前不可用 7 if 語句可以重寫為
if ($Value -eq 7) { "Value is 7" } else { "Value isn't 7" }
這應該在 5.1 和 7 版本上運行。
我的建議是使用switch
function FunctionName {
switch ($PSVersionTable.PSVersion.Major -le 5) {
false { Write-Output "PowerShell Versions is 7 " }
Default { Write-Output "PowerShell Versions is 5 "}
}
# verify output
$PSVersionTable.PSVersion.ToString()
}
在windows powershell
output 上
PS> FunctionName
PowerShell Versions is 5
5.1.22621.963
在VS-Code with pwsh 7
PS> FunctionName
PowerShell Versions is 7
7.3.1
有關開關的更多信息
希望這能有所幫助。 我發現 switch 語句更容易理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.