簡體   English   中英

Powershell 腳本和管道

[英]Powershell script and pipeline

我想知道是否可以在沒有管道(垂直線)的情況下編寫此命令?

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

因此,一開始您應該始終嘗試將過濾器向左移動,因此如果有問題的 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
}

讓我知道您認為我們可以進一步開展工作。

? 塊可以由 WMI 過濾器替換, select語句可以由成員引用 ( . ) 運算符替換。

最后,您可以將該操作的結果直接加入文件名並跳過cd

& (Join-Path (gwmi Win32_Volume -Filter "Label = '_'").Name 'd.cmd')
$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也會失敗)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM