Get-ChildItemの結果が置換できない


アニメ『CHAOS;CHILD』(2017)

ハードな雰囲気がよくて、見始めました。

今回はPowerShellでGet-ChildItemと置換。
文字列の置換は、Replace使えば簡単ですね。

PS C:\Users\takk\tmp> $a="HELLO"
PS C:\Users\takk\tmp> $a
HELLO
PS C:\Users\takk\tmp> $a -replace "L","_"
HE__O
PS C:\Users\takk\tmp>

Get-ChildItemの結果の置換はどうでしょう。まず、変数に代入。

PS C:\Users\takk\tmp> $a=Get-ChildItem
PS C:\Users\takk\tmp> $a


    ディレクトリ: C:\Users\takk\tmp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2018/03/07     21:10            dir1


PS C:\Users\takk\tmp>

この結果の、ModeをHelloに変えてみましょう。

PS C:\Users\takk\tmp> $a -replace "Mode","Hello"
dir1
PS C:\Users\takk\tmp>

おかしいです。結果の文字列がdir1のみになってしまいました。

型を確認します。置換前。

S C:\Users\takk\tmp> $a.GetType()

sPublic IsSerial Name                                     BaseType
------- -------- ----                                     --------
rue     True     DirectoryInfo                            System.IO.FileSys...


S C:\Users\takk\tmp>

置換後。

PS C:\Users\takk\tmp> ($a -replace "Mode","Hello").GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object


PS C:\Users\takk\tmp>

DirectoryInfoの時は、メッセージ付きのディレクトリ情報が表示されて、Stringの時は、ディレクトリ一覧のみが表示されてるっぽいですね。

仕方がないので、一旦ファイルに落としてから変数に格納し直します。

PS C:\Users\takk\tmp> $a > tmp
PS C:\Users\takk\tmp> $a=gc tmp
PS C:\Users\takk\tmp> rm tmp
PS C:\Users\takk\tmp>

まあ、強引なやり方です。

PS C:\Users\takk\tmp> $a -replace "Mode","Hello"


    ディレクトリ: C:\Users\takk\tmp


Hello                LastWriteTime     Length Name

----                -------------     ------ ----
d----        2018/03/07     21:10            dir1
PS C:\Users\takk\tmp>

ちゃんとModeがHelloに置換できました。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA