2016-05-04 8 views
0

パスを検証しようとしているので、意味のあるエラーログを出力できます。ワイルドカードで問題が発生しています。 これは、フォルダと何かがある場合を除いてFalseを返しますが、Trueを返します。テストパス-isValid withワイルドカード

Test-Path -isValid -path:"C:\Somefolder\*" 

-literalPathはワイルドカードを解釈しないため、このように動作しません。

Test-Path -isValid -literalPath:"C:\Somefolder\*" 

私の感覚では、私はワイルドカードをテストしているつもり、と親フォルダにTest-Path -isValid見つかった場合だということです。しかし、私は-likeで問題に遭遇します。なぜなら、私は* .EXTのような条件を実際にテストすることができないからです。唯一の本当の答えはRegExだと私は思っていますが、これは基本的なものなので、RegExに頼る必要はないはずです。おそらく何か不足しています。 さまざまな理由から、PS v2に限定されています。

編集:明確にするために、実際のパスは可変です。ユーザーはXMLファイル内のパスを提供し、パスを検証してそのパスを使用します。したがって、ユーザーが特定のパスのすべてのTXTファイルを削除したいと思うかもしれません。またはすべてのファイル。またはすべてのファイルとサブフォルダ。したがって、C:\ Somefolder \ *をサポートする必要があります。それらがあった場合C:\\ Somefolder \ *またはC:Somefolder \ *無効なパスとしてフラグを設定したいと思います。しかしC:\ Somefolder \ * Somefolderが存在しない場合、無効なパスではなく、フォルダが見つからないため、別のエラーとしてフラグを設定します。

Test-Path -IsValid C:\Somefolder 

編集:

+1

どのパスをテストしますか? 'Test-Path" C:\ Somefolder "は十分ですか? –

答えて

0

あなたは、このようにしてみてくださいすることができ、その後、なぜあなたは、テストパスのワイルド文字を残していませんか?

$test.Substring(0,($test.length-($test.Split("\")[-1]).length-1)) 
+1

ミラノとアンドレイは、OP改訂版を参照してください。この場合、ワイルドカードをサポートする必要があるので、C:\ Somefolderはオプションではありません。私が言ったように、私は有効なワイルドカードをテストしなければならないので、私はこれを正確にテストするつもりであると思う。その前で、私はエスケープされたワイルドカードのように使うことができると思う。 – Gordon

2

実際には、パス指定を検証するための正規表現が必要です。このような何か作業をする必要があります:

$re = '^[a-z]:[/\\][^{0}]*$' -f [regex]::Escape(([IO.Path]::InvalidPathChars -join '')) 
'C:\something\*' -match $re # returns $true 

式はコロン、前方またはバックスラッシュ、および有効なパス任意の数の文字が続く文字で始まる任意の文字列にマッチします。

パス内で連続するパス区切り文字が有効であるため、C:\\something\* -match $reも同様に、$trueと評価されます。あなたの代わりに、パス仕様の実際の(既存)のパスを検証したい場合は

あなたはGet-ChildItemを使用することができます。

function Test-WildcardPath($Path) { 
    Get-ChildItem $Path -ErrorAction SilentlyContinue >$null 
    return $? 
} 

再び連続したパス区切り文字がパスで許可されているので、C:\\something\*は、$trueと評価されます。