gpt4 book ai didi

powershell - elseif 语句包含多个由 - 或失败分隔的表达式

转载 作者:行者123 更新时间:2023-12-04 01:56:32 24 4
gpt4 key购买 nike

我创建了一个 PowerShell 脚本,它基本上是一个简单的计算器。脚本需要传递3个参数,第一个是数字,第二个是算术运算符(+ - */),第三个是另一个数字,之后脚本返回计算出的值。

最初,脚本是这样工作的:

param (
[double]$num1,
[string]$op,
[double]$num2
)

switch ($op) {
"+" {write-host $($num1+$num2)}
"-" {write-host $($num1-$num2)}
"*" {write-host $($num1*$num2)}
"/" {write-host $($num1/$num2)}
}

但是,我想通过针对每种情况抛出不同的错误消息来使脚本更复杂一些:

  1. 当没有传递任何参数时,消息将是“您还没有指定任何参数”

  2. 当第二个参数不是“+”、“-”、“*”或“/”时,消息将是“您没有指定有效的运算符 (+ - */) 作为第二个参数”

  3. 当前两种情况没有发生但没有传递第三个参数(第二个数字)时,消息将是“您没有指定第二个数字”

因此,考虑到这一点,我对脚本进行了一些更改,结果如下:

param (
[double]$num1,
[string]$op,
[double]$num2
)

if ($num1 -eq "") {
write-host "You haven't specified any parameters"
} elseif (($op -ne "+") -or ($op -ne "-") -or ($op -ne "*") -or ($op -ne "/")) {
write-host "You haven't specified a valid operator (+ - * /) as the second parameter"
} elseif ($num2 -eq "") {
write-host "You haven't specified the second number"
} else {
switch ($op) {
"+" {write-host $($num1+$num2)}
"-" {write-host $($num1-$num2)}
"*" {write-host $($num1*$num2)}
"/" {write-host $($num1/$num2)}
}
}

所以现在,如果我不向脚本传递任何参数,我将收到“您尚未指定任何参数” 消息。

如果我只传递第一个参数,我会得到“您没有指定有效的运算符 (+ - */) 作为第二个参数”,这很好。

但是如果我传递第一个参数,并且作为第二个参数传递“+”、“-”、“*”或“/”,我仍然得到“您没有指定有效的运算符 (+ - */) 作为第二个参数” 消息,所以第一个 elseif 语句中有问题,尽管它在语法上似乎是正确的。

最佳答案

使用高级函数参数选项

mjolinor 建议的解决方案(在他的评论中)看起来像这样:

[CmdletBinding()]
param(
[Parameter(
Mandatory=$true
)]
[double]
$num1,

[Parameter(
Mandatory=$true
)]
[ValidateSet('+', '-', '*', '/')]
[string]
$op,

[Parameter(
Mandatory=$true
)]
[double]
$num2
)

switch ($op) {
"+" {write-host $($num1+$num2)}
"-" {write-host $($num1-$num2)}
"*" {write-host $($num1*$num2)}
"/" {write-host $($num1/$num2)}
}

这有一个额外的好处,就是让您可以使用 Tab 键完成运算符。

您的解决方案

你的不工作的原因是因为你在使用 -or 而你应该使用 -and:

elseif (($op -ne "+") -and ($op -ne "-") -and ($op -ne "*") -and ($op -ne "/"))

它可能会变得困惑,因为您正在检查否定条件(即 if (an_invalid_value)),其中内部条件被否定 (-ne ).

如果您选择减号 -,请考虑您的版本会发生什么:您评估 $op -ne '+' 并且这是真的,所以条件满足,没有别的经过测试,您可以直接告诉用户他们做错了事。对于 -and,需要满足 所有 -ne 条件。

这里有一个更简单的方法:

elseif ( ('+','-','*','/') -notcontains $op)

基本上你会说“如果这个运算符数组不包含$op,那么显示错误。”这更容易理解。

但真正更容易、更安全且可维护的是使用内置参数验证选项。学习他们;他们很棒!

关于powershell - elseif 语句包含多个由 - 或失败分隔的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27536434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com