Powershell实战之管道参数绑定
管道参数通过两种方式传递:ByValue和ByPropertyName,通过help查看命令是否支持这两种参数传递方式
1.ByValue
如果支持ByValue的方式,则匹配到对象类型,可以直接通过管道传递
get-process -name note* | stop-process
get-process 获取的对象类型可以通过get-member查看,为proecss,因此在这个示例中匹配ByValue方式进行管道传送
2.ByPropertyName
ByPropertyName则要求管道两端的对象拥有相同的属性名称,这样就能进行匹配
import-csv .\Computers.csv | get-process
在此示例中Computer.csv中属性必须写成ComputerName,这样就能与get-process中的ComputerName匹配上
对于属性名称不一致的情况,可以通过自定义属性,修改属性的名称,使两边匹配上
import-csv .\Computers.csv | select -property *, @{name='ComputerName';expression={$_.Computer}}
@{}用来创建一个哈希表,其中包含成对的健-值(Key-Value)
name/n/label/l : 新的属性名称
expression/e : 包含{} 的脚本块
$_ 是一个占位符,关联到已经存在的管道对象,通过$_可以读取管道中的对象属性Computer
以上示例将Computer属性重命名为一个新的属性ComputerName
3.不支持管道输入
对于不支持管道输入的命令,可以通过圆括号()进行参数传递
get-wmiobject -ComputerName (import-csv .\Computers.csv | select -expandproperty ComputerName) -Class Win32_BIOS
在这里需要注意ComputerName支持的对象类型是String,而import-csv的对象类型是PSCustomObject,在这里需要进行一个类型的转换
ComputerName属性本身的类型就是String,这里通过ExpandPropery可以对属性展开,将原对象中对应的属性拿出来,生成一个String类型的新对象