Powershell脚本和管道

时间:2019-12-03 15:26:46

标签: powershell

我想知道是否可以在不使用管线(垂直线)的情况下编写此命令吗?

$u=gwmi Win32_Volume|?{$_.Label -eq'_'}|select name;cd $u.name;.\d.cmd

3 个答案:

答案 0 :(得分:0)

?块可以用WMI筛选器替换,select语句可以用成员引用(.)运算符替换。

最后,您可以将该操作的结果直接添加到文件名中,并跳过cd

& (Join-Path (gwmi Win32_Volume -Filter "Label = '_'").Name 'd.cmd')

答案 1 :(得分:0)

因此,开始时,您应始终尝试向左移动过滤器,因此,如果所涉及的cmdlet具有过滤功能,请尝试使用它。在这种情况下,它将为您节省|对象在哪里。

$Vols = gwmi -Query "SELECT Name FROM Win32_Volume WHERE Label = '_'"

在这一点上,我认为您的状态良好,但随后的命令是

cd $Vols.name
.\d.cmd

如果$ Vols返回多个对象,则这些可能不起作用。

我不知道真正的意图是什么,但严格来说,您仍然可以避免出现类似以下内容的管道:

ForEach($Vol in $Vols){ 
    cd $Vol.name
    .\d.cmd
}

这就是为什么我将$ u更改为$ Vols ...

如果您只想使用name属性,则可以关注的是自动变量展开,例如:

$Vols = (gwmi -Query "SELECT Name FROM Win32_Volume WHERE Label ='_'" ).Name

ForEach($Vol in $Vols){ 
    cd $Vol
    .\d.cmd
}

让我知道您认为我们可以进一步做些什么。

答案 2 :(得分:0)

$u=gwmi Win32_Volume|?{$_.Label -eq '_'}|select name

$u = foreach ( $a in (gwmi Win32_Volume) ) { if ($a.Label -eq '_') { [PSCustomObject]@{Name = $a.Name}} }

以上命令是等效的,但是两者都可能导致以下情况之一:

  • 一个PSCustomObject(然后$u.Name给出一个字符串),或
  • 一个数组(然后$u.Name也给出一个数组,这样cd $u.Name就会失败),或者
  • $null值(然后$u.Name会引发错误,cd $u.Name也将失败)。