私は、powershell に関するプレゼンテーション用のいくつかの短いデモ スクリプトに取り組んでいます。このデモの目的は、powershell でオブジェクトを作成するさまざまな方法を示すことです。これが私のコードです:
$file = ls 'C:\temp' | Where-Object {$_.Extension -eq '.txt'}
$file.FullName
$path = 'C:\temp\jdh.txt'
$newfile = New-Object -TypeName System.IO.FileInfo -ArgumentList $path
$newfile.FullName
$file.GetType()
$newfile.GetType()
$file
$newfile
$file | Get-Content | out-null
$newfile | Get-Content | out-null
シンプルですよね?異なるメソッドを使用して 2 つの FileInfo オブジェクトを作成し、それらを読み取ります。出力は、ファイルが同一であることを示しています。
C:\temp\jdh.txt
C:\temp\jdh.txt
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True FileInfo System.IO.FileSystemInfo
True True FileInfo System.IO.FileSystemInfo
LastWriteTime : 4/10/2013 3:38:29 PM
Length : 46046
Name : jdh.txt
LastWriteTime : 4/10/2013 3:38:29 PM
Length : 46046
Name : jdh.txt
ただし、Get-Content が $newfile オブジェクトを読み取ろうとすると、次のエラーが発生します。
Get-Content : The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the
input and its properties do not match any of the parameters that take pipeline input.
At line:16 char:12
+ $newfile | Get-Content | out-null
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (C:\temp\jdh.txt:PSObject) [Get-Content], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.GetContentCommand
したがって、エラーで PSObject と表示されていることに気付きました。これは、私の出力では $newfile が FileInfo オブジェクトであるように見えるため、私を混乱させます。したがって、私が考え出した次の論理的なことは、$newfile を [System.IO.FileInfo] 型に型キャストすることです。同じエラーが発生しましたが、PSObject の代わりに FileInfo がタイプとして表示されるようになりました。では、$file と $newfile が同一のように見え、get-content が $file で機能している場合、どうしてこのエラーが発生するのでしょうか? new-object コマンドを使用する場合、微妙な違いはありますか?