5

私は、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 コマンドを使用する場合、微妙な違いはありますか?

4

2 に答える 2

6

を使用して作成されたオブジェクトとのバインディングをトレースしましたがNew-Object、問題は情報オブジェクトGet-Contentのプロパティにバインドできなかったことです。FileInfo

これは、次のコマンドで確認できます。

Trace-Command -psHost -Name ParameterBinding {$newFile | gc}
Trace-Command -psHost -Name ParameterBinding {$file | gc}

したがって、正常にバインドされたもののトレースを見ると、リテラル パスMicrosoft.PowerShell.Core\FileSystem::が PsPath で始まるプロパティにバインドされていることがわかります。したがって、パイプするときにオブジェクトのプロパティを比較して詳しく調べると、Get-Member機能するものにはこれらのメモのプロパティがあることがわかりますが、作成されたものにNew-Objectはありません-

  • PSChildName
  • PSドライブ
  • PSIコンテナ
  • PSParentPath
  • PSPath
  • PSプロバイダー

Get-Contentコマンドレット パラメーターを見ると、LiteralPathエイリアスがPsPath次のようになっていることがわかります。

(Get-Command -Name Get-Content).ParameterSets

  Parameter Name: LiteralPath
    ParameterType = System.String[]
    Position = 0
    IsMandatory = True
    IsDynamic = False
    HelpMessage =
    ValueFromPipeline = False
    ValueFromPipelineByPropertyName = True
    ValueFromRemainingArguments = False
    Aliases = {PSPath}
    Attributes =
      System.Management.Automation.AliasAttribute
      System.Management.Automation.ParameterAttribute

New-Object作成したプロパティを追加すると、次のように機能しますFileInfo

$newFile | Add-Member -MemberType NoteProperty -Name PsPath -Value 'Microsoft.PowerShell.Core\FileSystem::C:\temp\jdh.txt'
于 2013-04-15T13:50:28.330 に答える