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")

これらのコード行を使用すると、Enter キーを押すだけで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 になります。条件を次のように変更する必要があります。$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 に答える