1

问题是在in 中PowerShell 3.0 cmdlet使用。C#.Net Framework 4.0Visual Studio 2010

我们正在编写一个需要管道输入的 PowerShell cmdlet。喜欢...

Get-Content .\somefile.bin -Encoding Byte | Receive-Bytes

Receive-Bytes cmdlet 需要以与 Set-Content 相同的方式工作。喜欢...

Get-Content .\somefile.bin -Encoding Byte | Set-Content otherfile.bin -Encoding Byte

我们尝试了以下三个选项:

[System.Management.Automation.Parameter(Position = 1, Mandatory = true, ValueFromPipeline = true)]
public byte Input { private get; set; }
public byte[] Input { private get; set; }
public System.IO.BinaryReader Input { private get; set; }

但是... byte、byte[]、BinaryReader 都会导致相同的错误。

+ Get-Content .\somefile.bin | Receive-Bytes
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: [Receive-Bytes], ParameterBindingException
+ FullyQualifiedErrorId : 

Receive-Bytes : 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.

我们注意到错误重复了好几次,这表明 Get-Content 实际上正在发送几块数据。研究并发现情况确实如此(http://brianreiter.org/2010/01/29/powershells-object-pipeline-corrupts-piped-binary-data/),但这让我们离解决它更近了一步。

所以...问题是:我们如何设置 System.Management.Automation.Parameter 来接受从 Get-Content 发送的字节流?

更新:下面的答案指向在 Get-Content 上使用 -Encoding Byte,并在 Receive-Bytes 中使用...

public IConvertible Input { private get; set; }

IConvertible 获取数据。但是我们在 Receive-Bytes 中获取的内容与我们使用 Get-Content 选择的源文件不匹配。

那么......我们如何设置参数以将 IConvertible 更改回字节流?

4

0 回答 0