0

我正在尝试创建一个函数,其中用户必须提供一个不能包含空字符串的文件名。除此之外,字符串不能包含点。例如,当我运行此功能时,我会在输入“test”时不断循环。知道为什么吗?

 function Export-Output {
     do {
         $exportInvoke = Read-Host "Do you want to export this output to a new .txt file? [Y/N]"
     } until ($exportInvoke -eq "Y" -or "N")

     if ($exportInvoke -eq "Y") {
        do {
           $script:newLog = Read-Host "Please enter a filename! (Exclude the extension)"
           if ($script:newLog.Length -lt 1 -or $script:newLog -match ".*") {
               Write-Host "Wrong input!" -for red
           }
       } while ($script:newLog.Length -lt 1 -or $script:newLog -match ".*")

       ni "$script:workingDirectory\$script:newLog.txt" -Type file -Value $exportValue | Out-Null
    }
}

编辑:

在相关说明中:

do {
    $exportInvoke = Read-Host "Do you want to export this output to a new .txt file? [Y/N]"
} until ($exportInvoke -eq "Y" -or "N")

当我使用这些代码行时,我可以简单地按回车键来绕过Read-Host. 当我"Y" -or "N"简单地替换它时"Y",它不会。知道为什么会这样吗?

4

2 回答 2

2

运算符检查正-match则表达式,因此:

$script:newLog -match ".*"

正在测试文件名是否包含除换行符 ( .) 0 次或更多次 ( *) 之外的任何字符。此条件将始终为真,从而创建一个无限循环。

如果要测试文字点,则必须对其进行转义:

$script:newLog -match '\.'

至于您的另一个问题,您误解了逻辑和比较运算符的工作原理。$exportInvoke -eq "Y" -or "N"并不意味着$exportInvoke -eq ("Y" -or "N"),即变量等于“Y”或“N”。这意味着($exportInvoke -eq "Y") -or ("N")。由于表达式的计算结果"N"为零,PowerShell 将其解释为$true,因此您的条件变为($exportInvoke -eq "Y") -or $true,这始终为真。您需要将条件更改为:

$exportInvoke -eq "Y" -or $exportInvoke -eq "N"
于 2013-09-04T17:27:49.237 回答
1

使用它来测试您的输入:

!($script:newLog.contains('.')) -and !([String]::IsNullOrEmpty($script:newLog)) -and !([String]::IsNullOrWhiteSpace($script:newLog))

您的正则表达式 (-match ".*"基本上匹配所有内容。

于 2013-09-04T17:34:18.080 回答