質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

1371閲覧

パイプラインから与えた Path パラメータ

Zuishin

総合スコア28656

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

2クリップ

投稿2019/03/01 01:18

編集2019/03/01 06:00

パスを扱う多くのコマンドレットは 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 で渡したとしても文字列と区別がつかないはずです。

ではなぜこのような違いが出るのでしょうか?

追記

以下のキーワードが発見されましたがまだ解決には至っていません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/05 08:10

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

回答2

0

ベストアンサー

-Pathのパラメータを持つコマンドレットは同時にワイルドカードを許可しない-LiteralPathというパラメータを持っている場合があります。
その場合 大体は-Pathパラメータは 渡されたの文字列にワイルドカードとして認識できる文字列がある場合はワイルドカードとして扱われます。
Remove-Itemの公式ドキュメントを見ると-pathパラメータはワイルドカードが許可されている事が分かります。
あと-LiteralPathもパイプライン入力を受け入れています。
上記のこともあり経験則上
FileInfo等をパイプラインで渡した場合は-LiteralPathが使われているのではないかと思います。

--追記--
FileInfoのプロパティーを見たらPathが無くて代わりにPsPathなるものがあったので実験して見ました
コード

powershell

1Write-Host "`nパターンA" 2[PsCustomObject]@{ 3 PsPath = "Microsoft.PowerShell.Core\FileSystem::D:\Users\Desktop[" 4} | Remove-Item -WhatIf 5 6Write-Host "`nパターンB" 7[PsCustomObject]@{ 8 Path = "D:\Users\Desktop[" 9} | Remove-Item -WhatIf 10 11Write-Host "`nパターンC" 12@("D:\Users\Desktop[") | Remove-Item -WhatIf

結果

パターンA WhatIf: 対象 "D:\Users\Desktop[" に対して操作 "ファイルの削除" を実行しています。 パターンB Remove-Item : 指定されたワイルドカード文字パターンは無効です: [ 発生場所 行:9 文字:5 + } | Remove-Item -WhatIf + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Remove-Item], WildcardPatternException + FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.RemoveItemCommand パターンC Remove-Item : 指定されたワイルドカード文字パターンは無効です: [ 発生場所 行:12 文字:27 + @("D:\Users\Desktop[") | Remove-Item -WhatIf + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Remove-Item], WildcardPatternException + FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.RemoveItemCommand

どうでしょうか?

投稿2019/03/01 07:06

編集2019/03/01 08:29
kamikazelight

総合スコア305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/03/01 08:00

LiteralPath も確かにパイプラインからの入力を受け付けますが、ByProperty なので、入力には LiteralPath という名前のプロパティが必要なはずです。 この場合は Get-Member で調べてみてもそういう名前のプロパティが存在しなかったので、LiteralPath のことは念頭にありませんでした。 ただ、FileInfo の場合のみ特別に LiteralPath にリダイレクトされる可能性は確かにありますね。そちらの方向でも調べてみます。ありがとうございました。 私は常日頃偉そうに回答していますが、抜けているところも多いので、また気づかせてもらえるとありがたいです。
kamikazelight

2019/03/01 08:06

少しでも力になれたのならばよかったです 私も気になっていろいろ見ているのですが path と LiteralPath が両方とも必須になっていたので `help remove-item`を見てみたら構文が2つあったのですが パラメータの定義の順番が違うのも気になりました。
kamikazelight

2019/03/01 08:34 編集

FileInfo に そもそも Path プロパティが無かったので 少し実験をしてみました。 上記に追記しましたが参考になりますか? PsPath の値は FileInfoを見てそのValueを指定しました。
Zuishin

2019/03/01 08:35

ビンゴです! LiteralPath のエイリアスに PSPath がありました。 ありがとうございました。 PS> (Get-Command Remove-Item).Parameters.LiteralPath Name : LiteralPath ParameterType : System.String[] ParameterSets : {[LiteralPath, System.Management.Automation.ParameterSetMetadata]} IsDynamic : False Aliases : {PSPath, LP} Attributes : {, System.Management.Automation.AliasAttribute} SwitchParameter : False
kamikazelight

2019/03/01 09:02

いつもお世話になってばかりなので お力になれたのならよかったです これからもよろしくお願い致します。
Zuishin

2019/03/01 10:04

こちらこそよろしくお願いします。
guest

0

それくらい自分で調べればわかりますよね?あなたはC言語を知っていますか?

投稿2021/01/05 08:10

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問