首页 > 解决方案 > Powershell 脚本和管道

问题描述

我想知道这个命令是否可以在没有管道(垂直线)的情况下编写?

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

标签: powershell

解决方案


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

$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
}

让我知道您认为我们可以进一步开展工作。


推荐阅读