2016-04-04 10 views
2

ファイル名の入力を検証し、無効な文字がPowerShellに含まれているかどうかを確認したいと思います。私はこれらの文字のうちの1つだけが入力されたときに動作するが、与えられた英数字の文字列にこれらの文字が含まれている場合には動作しないようにするアプローチに従ってみた。私は正規表現を正しく構築していないと信じています。与えられた文字列にこれらの文字が含まれているかどうかを検証する正しい方法は何でしょうか?前もって感謝します。Powershellでのファイル名入力の検証

#Validate file name whether it contains invalid characters: \/: * ? " < > | 
$filename = "\?filename.txt" 
if($filename -match "^[\\\/\:\*\?\<\>\|]*$") 
    {Write-Host "$filename contains invalid characters"} 
else 
    {Write-Host "$filename is valid"} 

答えて

4

私はむしろ正規表現パターンで文字をハードコーディングするよりもPath.GetInvalidFileNameChars()を使用して、ファイル名に無効な文字のいずれかが含まれているかどうかをテストするためにString.IndexOfAny() methodを使用します。

function Test-ValidFileName 
{ 
    param([string]$FileName) 

    $IndexOfInvalidChar = $FileName.IndexOfAny([System.IO.Path]::GetInvalidFileNameChars()) 

    # IndexOfAny() returns the value -1 to indicate no such character was found 
    if($IndexOfInvalidChar -eq -1) 
    { 
     return $true 
    } 
    else 
    { 
     return $false 
    } 
} 

、その後:

$filename = "\?filename.txt" 
if(Test-ValidFileName $filename) 
{ 
    Write-Host "$filename is valid" 
} 
else 
{ 
    Write-Host "$filename contains invalid characters" 
} 

あなたがneを定義したくない場合W機能、これは簡略化することができます:正規表現を修正するには

if($filename.IndexOfAny([System.IO.Path]::GetInvalidFileNameChars()) -eq -1) 
{ 
    Write-Host "$filename is valid" 
} 
else 
{ 
    Write-Host "$filename contains invalid characters" 
} 
+3

必要に応じて、正規表現パターンを次のように作成することができます: '[{0}] '-f [regex] :: Escape(([IO.Path] :: GetInvalidFileNameChars()-join' '))) ' –

+0

Mathias、簡略化されたアプローチが働き、私が探していたものです。ありがとうございました。 – user5349170

1

は、文字列の端にアンカーそれ^$を削除してください。

+0

^と$を削除して固定しました。 GetInvalidFileNameChars()を使用したマティアスのアプローチはうまく見えます。 – user5349170