使用 Where {(...)} 后如何在 Powershell 中执行两个命令

How to execute two commands in Powershell after using Where {(...)}

在使用 Where 条件过滤文件后,如何 运行 同时使用 'rename' 命令和 'hidden' 命令。每个命令 运行 放置在第一位时它自己很好,但第二个被忽略。

Get-ChildItem -Recurse -Force | Where {(
    $_.Extension -ne ".mp3" -and
    $_.Extension -ne ".wmv" )} |
Set-ItemProperty -Name Attributes -Value "Hidden" -WhatIf |
Rename-Item -NewName {$_.Name -replace $_.Extension, -join($_.Extension, ".notmusic")} - 
WhatIf

我用ForEach-Object

Get-ChildItem -Recurse -Force | Where {(    $_.Extension -ne ".mp3" -and    $_.Extension -ne ".wmv" )} | ForEach-Object { 
Set-ItemProperty -Name Attributes -Value "Hidden" -Path $_.FullName -WhatIf
Rename-Item -Path $_.FullName -NewName "$($_.Name).notmusic" -WhatIf
}

我加在Set-ItemProperty-Path

Set-ItemProperty -Name Attributes -Value "Hidden" -Path $_.FullName -WhatIf

我改变了Rename-Item-Path-NewName

Rename-Item -Path $_.FullName -NewName "$($_.Name).notmusic"

For-Each:

Get-ChildItem -Recurse -Force | Where {( $_.Extension -ne ".mp3" -and  $_.Extension -ne ".wmv" )} | ForEach-Object {
    $_ | Set-ItemProperty -Name Attributes -Value "Hidden" -WhatIf
    $_ | Rename-Item -NewName { $_.Name -replace $_.Extension, -join($_.Extension, ".notmusic")} -WhatIf
}

我看到您目录中的前几节 grab 文件不是 mp3 或 wmv 文件。

Get-ChildItem -Recurse -Force | Where {($_.Extension -ne ".mp3" -and $_.Extension -ne ".wmv")}

那部分不错。但是由于您对每个文件执行了两项操作,因此您应该以

的形式通过管道传输到 ForEach-Object
... | ForEach-Object {
     # do something
     # do something else
}

并且由于您没有直接通过管道传输到 Set-ItemProperty cmdlet,因此您需要将文件名的路径传递给它:

Set-ItemProperty -Path $_.FullName -Name Attributes -Value "Hidden"

然后我们进入您的重命名命令。看起来您希望名称为 filename.notmusic。同样,我们需要将文件路径传递给 cmdlet。另请注意如何使用子表达式 clean/nice 定义新名称的方法

Rename-Item -Path $_.FullName -NewName "$($_.BaseName).notmusic"

好的,所以把它们放在一起,我们有:

Get-ChildItem -Recurse -Force | Where-Object {($_.Extension -ne ".mp3" -and $_.Extension -ne ".wmv")} | ForEach-Object {
    Set-ItemProperty -Path $_.FullName -Name Attributes -Value "Hidden" -WhatIf 
    Rename-Item -Path $_.FullName -NewName "$($_.BaseName).notmusic" -WhatIf
}