使用变量作为运算符 - Powershell
Use a variable as an operator - Powershell
我开始使用 Powershell 并尝试做一个简单的计算器。
这是我的:
Function ReturnRes ($x,$y,$z)
{
$res= [float] $z [float]$y
return $res
}
Write-Host $res
$var1 = Read-Host "Zahl1"
$var2 = Read-Host "Zahl2"
$op = Read-Host "Operator(+-*/)"
ReturnRes -x $var1 -y $var2 -z $op
但是我不能使用 $z
变量作为操作...
有什么想法吗?
你必须使用 Invoke-expression
cmdlet 来完成这种工作。
这是您需要的:
Function ReturnRes ($x,$y,$z)
{
$res= "[float]$x $z [float]$y"
iex $res
}
您可以使用 Invoke-Expression
:
PS C:\> $x,$y,$op = '1.23','3.21','+'
PS C:\> Invoke-Expression "$x$op$y"
4.44
确保您验证输入:
Function Invoke-Arithmetic
{
param(
[float]$x,
[float]$y,
[ValidateSet('+','-','*','/')]
[string]$op
)
return Invoke-Expression "$x $op $y"
}
这是另一种解决方案,将默认情况添加到开关以处理 non-valid 运算符:
Function ReturnRes($x,$y,$z){
switch($z){
"+" {[float]$x + [float]$y}
"-" {[float]$x - [float]$y}
"*" {[float]$x * [float]$y}
"/" {[float]$x / [float]$y}
}
}
Write-Host $res
$var1 = Read-Host "Zahl1"
$var2 = Read-Host "Zahl2"
$op = Read-Host "Operator(+-*/)"
ReturnRes -x $var1 -y $var2 -z $op
如果您想要更大的灵活性(例如支持三角函数的能力),您可以这样做:
$lookupFunction = @{"+"={$args[0]+$args[1]};
"-"={$args[0]-$args[1]};
"*"={$args[0]*$args[1]};
"/"={$args[0]/$args[1]};
"sin"={[math]::sin($args[0])}
}
Write-Host $res
$var1 = Read-Host "Zahl1"
$var2 = Read-Host "Zahl2"
$op = Read-Host "Operator(+ - * / sin)"
if ($lookupFunction.containsKey($op)) {
# $var2 is ignored in case of sin function
& $lookupFunction[$op] $var1 $var2
} else {
write-host Unsupported operator: $op
}
除了比 invoke-expression 更灵活之外,它还使用户不必知道 sin 函数(例如)是使用此语法访问的 [math]::sin(arg)
我开始使用 Powershell 并尝试做一个简单的计算器。
这是我的:
Function ReturnRes ($x,$y,$z)
{
$res= [float] $z [float]$y
return $res
}
Write-Host $res
$var1 = Read-Host "Zahl1"
$var2 = Read-Host "Zahl2"
$op = Read-Host "Operator(+-*/)"
ReturnRes -x $var1 -y $var2 -z $op
但是我不能使用 $z
变量作为操作...
有什么想法吗?
你必须使用 Invoke-expression
cmdlet 来完成这种工作。
这是您需要的:
Function ReturnRes ($x,$y,$z)
{
$res= "[float]$x $z [float]$y"
iex $res
}
您可以使用 Invoke-Expression
:
PS C:\> $x,$y,$op = '1.23','3.21','+'
PS C:\> Invoke-Expression "$x$op$y"
4.44
确保您验证输入:
Function Invoke-Arithmetic
{
param(
[float]$x,
[float]$y,
[ValidateSet('+','-','*','/')]
[string]$op
)
return Invoke-Expression "$x $op $y"
}
这是另一种解决方案,将默认情况添加到开关以处理 non-valid 运算符:
Function ReturnRes($x,$y,$z){
switch($z){
"+" {[float]$x + [float]$y}
"-" {[float]$x - [float]$y}
"*" {[float]$x * [float]$y}
"/" {[float]$x / [float]$y}
}
}
Write-Host $res
$var1 = Read-Host "Zahl1"
$var2 = Read-Host "Zahl2"
$op = Read-Host "Operator(+-*/)"
ReturnRes -x $var1 -y $var2 -z $op
如果您想要更大的灵活性(例如支持三角函数的能力),您可以这样做:
$lookupFunction = @{"+"={$args[0]+$args[1]};
"-"={$args[0]-$args[1]};
"*"={$args[0]*$args[1]};
"/"={$args[0]/$args[1]};
"sin"={[math]::sin($args[0])}
}
Write-Host $res
$var1 = Read-Host "Zahl1"
$var2 = Read-Host "Zahl2"
$op = Read-Host "Operator(+ - * / sin)"
if ($lookupFunction.containsKey($op)) {
# $var2 is ignored in case of sin function
& $lookupFunction[$op] $var1 $var2
} else {
write-host Unsupported operator: $op
}
除了比 invoke-expression 更灵活之外,它还使用户不必知道 sin 函数(例如)是使用此语法访问的 [math]::sin(arg)