
パスを扱う多くのコマンドレットは Path
パラメータを取り、それらは String[]
型で ValueFromPipeline
属性を持つことが多いと思います。
PS> (Get-Command Remove-Item).Parameters.Path Name : Path ParameterType : System.String[] ParameterSets : {[Path, System.Management.Automation.ParameterSetMetadata]} IsDynamic : False Aliases : {} Attributes : {} SwitchParameter : False PS> (Get-Command Remove-Item).Parameters.Path.Attributes ExperimentName : ExperimentAction : None Position : 0 ParameterSetName : Path Mandatory : True ValueFromPipeline : True ValueFromPipelineByPropertyName : True ValueFromRemainingArguments : False HelpMessage : HelpMessageBaseName : HelpMessageResourceId : DontShow : False TypeId : System.Management.Automation.ParameterAttribute
この時、疑問があります。
C:\Users\Zuishin\Desktop[
というファイルがある時、Remove-Item
にパイプラインから文字列を渡した場合と FileInfo
を渡した場合で挙動が異なります。
PS> '[' | Remove-Item -WhatIf Remove-Item : The specified wildcard character pattern is not valid: [ At line:1 char:7 + '[' | Remove-Item -WhatIf + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Remove-Item], WildcardPatternException + FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.RemoveItemCommand
PS> Get-ChildItem | Remove-Item -WhatIf What if: Performing the operation "Remove File" on target "C:\Users\Zuishin\Desktop[".
上記のように、文字列として渡した場合には [
はワイルドカードとして処理され、エラーが出ます。しかし、FileInfo
として渡した場合にはワイルドカードではなくパス名として処理されます。
しかし、パラメータ Path
はあくまで String[]
型であり、このパラメータに入力された値はすべて文字列になるはずです。それならば、たとえ FileInfo
で渡したとしても文字列と区別がつかないはずです。
ではなぜこのような違いが出るのでしょうか?
追記
以下のキーワードが発見されましたがまだ解決には至っていません。

何を言いたいのかただわからない質問、またプログラミングと全く関係ない。

回答2件
あなたの回答
tips
プレビュー