Powershell -在循环、变量初始化和if语句中调用函数

35g0bw71  于 2022-12-13  发布在  Shell
关注(0)|答案(1)|浏览(188)

正如标题所说,我在循环中使用函数、变量初始化和if语句作为条件时遇到了一些麻烦。然而,如果我只是突然调用函数,它确实工作得很好,这让我认为问题在于我如何调用函数,而不是函数本身,尽管我可能错了。
下面是我尝试调用的函数:

function checkAlphaNumerical {
    param (
        #First, the string to validate, then a string to append to the error message
        $stringToValidate, $stringDesc
    )
    if ($stringToValidate -notmatch '^[a-z0-9]+$') {
        Write-Output ("Invalid $($stringDesc)")
        return $false
    }
    else {
        return $true
    }
}

由于我在函数的两个可能路径上都使用了return $truereturn $false,Powershell控制台应该根据字符串值输出TrueFalse
下面是调用函数的唯一场景:

checkAlphaNumerical $testinput "test"

下面是三个不起作用的例子:
第一个
提前感谢您的帮助。

gmxoilav

gmxoilav1#

它没有按预期工作,因为当测试结果为false时,您的函数返回一个两元素对象数组:

PS > $TestFailure = checkAlphaNumerical '%' "FailTest"
PS > $TestFailure
Invalid FailTest
False
PS > $TestFailure.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS > $TestFailure[0]
Invalid FailTest
PS > $TestFailure[1]
False
PS > [bool]$TestFailure
True
PS keith>

当数组被转换为布尔值时,就像它作为测试条件时一样,它返回$True
write-Output更改为Write-Warning将在控制台上显示“Invalid....”消息,同时确保返回值仅为$False。此外:

  • PowerShell函数中,不需要Return语句。将返回任何未使用的输出。
  • 因为$stringDesc只是一个字符串变量,所以扩展字符串中不需要"...$($stringDesc)"

所以你的函数的工作版本是:

function checkAlphaNumerical {
    param (
        #First, the string to validate, then a string to append to the error message
        $stringToValidate, $stringDesc
    )
    if ($stringToValidate -notmatch '^[a-z0-9]+$') {
        Write-Warning ("Invalid $stringDesc")
        $false
    }
    else {
        $true
    }
}

输出量:

PS > do {
>>     $testinput = Read-Host -Prompt "Enter string"
>> } while (!(checkAlphaNumerical $testinput "test"))
Enter string: '%'
WARNING: Invalid test
Enter string: '?'
WARNING: Invalid test
Enter string: abc
PS >

相关问题