我想知道是否可以在不使用管线(垂直线)的情况下编写此命令吗?
$u=gwmi Win32_Volume|?{$_.Label -eq'_'}|select name;cd $u.name;.\d.cmd
答案 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
也将失败)。