【发布时间】:2015-01-29 11:55:48
【问题描述】:
我正在尝试编写一个 cmdlet,以反映像 cat 这样的 UNIX 命令给我的内容(在没有文件的情况下从文件或标准输入中读取)。它需要考虑以下可能性:
cmdlet -file <inputFileName>
cmdlet -object <objectName>
<someObject> | cmdlet
在这种情况下,我将“文件”的定义扩展为包含任意对象。
它必须处理具有以下优先级的参数:
- 如果某个对象已明确指定或在管道中可用,请使用该对象。
- 否则,使用文件名。
我的参数配置为:
[CmdletBinding(DefaultParameterSetName = "path")]
param(
[Parameter(ParameterSetName = "path",
Mandatory = $false,
Position = 0)]
[string] $file,
[Parameter(ParameterSetName = "object",
Mandatory = $false,
Position = 0,
ValueFromPipeline = $true)]
[Object] $object,
[Parameter(Mandatory = $false)]
[Int] $addrsize,
[Parameter(Mandatory = $false)]
[String] $title
)
(虽然我怀疑最后两个参数不相关,但我已将所有参数放入其中)。
所以,有两个参数集,一个带有一个保存文件名的字符串,另一个带有一个对象,允许在管道中传递对象。
在我的begin 块中,我有以下代码来读取文件内容:
[byte[]] $bytes = $null
if($file) {
$bytes = [IO.File]::ReadAllBytes((Resolve-Path $file))
}
因此,如果您提供 -file 参数,则数组将加载文件内容。
在process 块中,我检查-object 参数以查看它是否存在(作为显式参数或在管道中)。如果是,我用它来用对象覆盖字节数组:
if (Test-Path variable:\object) {
Write-Output "processing object" ## DEBUG code
if ($object -is [Byte]) {
$bytes = $object
} else {
$inputString = [string] $object
$bytes = [Text.Encoding]::Unicode.GetBytes($inputString)
}
}
现在我完全明白了,如果我使用:
Write-Output "blah" | MyFunction -file myfile.txt
然后管道优先,文件被忽略。
但是,即使我预计没有 管道,这似乎也在发生:
MyFunction -file myfile.txt
结果是,当我使用上面的最后一条语句时,bytes 数组被设置为空,因此文件被忽略。
我怎样才能重组这段代码来做我想做的事?是否有其他方法可以判断管道是否为空,以便我不丢弃文件内容?
【问题讨论】:
标签: powershell parameters pipeline