1
Get-ChildItem -recurse | Where {!$_.PSIsContainer -and `
$_.LastWriteTime -lt (get-date).AddDays(-31)} | Remove-Item -whatif

Get-ChildItem -recurse | Where {$_.PSIsContainer -and `
@(Get-ChildItem -Lit $_.Fullname -r | Where {!$_.PSIsContainer}).Length -eq 0} |
Remove-Item -recurse -whatif

上記のスクリプトは適切に機能します。次は、それを次のスクリプトと組み合わせて 1 つのスクリプトにします。

$path = "<path to file>"
$shell = new-object -comobject "Shell.Application"
$item = $shell.Namespace(0).ParseName("$path")
$item.InvokeVerb("delete")

これが私の結合されたスクリプトです:

Get-ChildItem -recurse | Where {$_.PSIsContainer -and `
@(Get-ChildItem -Lit $_.Fullname -r | Where {!$_.PSIsContainer}).Length -eq 0} |
$path = $_.Fullname
$shell = new-object -comobject "Shell.Application"
$item = $shell.Namespace(0).ParseName("$path")
$item.InvokeVerb("delete") -recurse -whatif

しかし、私はいつもエラーメッセージを受け取ります:

Expressions are only allowed as the first element of a pipeline.
At line:3 char:7

You must provide a value expression on the right-hand side of the '-' operator.
At line:6 char:28

Unexpected token 'recurse' in expression or statement.
At line:6 char:29

Unexpected token '-whatif' in expression or statement.
At line:6 char:37

誰でも私を助けることができますか?

4

1 に答える 1

2

Foreach-Objectパイプラインの最後の部分でコマンドレット (エイリアスは foreach)を使用する必要があります。また、パイプラインで毎回 Shell.Application オブジェクトを作成する必要はありません。

$shell = new-object -comobject "Shell.Application"
Get-ChildItem -recurse | 
    Where {$_.PSIsContainer -and `
           @(Get-ChildItem -Lit $_.Fullname -r | Where {!$_.PSIsContainer}).Length -eq 0} |
    Foreach {
        $item = $shell.Namespace(0).ParseName(($_.Fullname))
        $item.InvokeVerb("delete")
    }

そうは言っても、Remove-Itemコマンドレットを使用しない理由がわかりません。

Get-ChildItem . -r | Where {$_.PSIsContainer -and !$(Get-ChildItem $_.fullname)} | 
    Remove-Item -WhatIf

これをスクリプトにするには、上記のコマンドを次のように .ps1 ファイルに入れます。

-- Contents of DeleteEmptyDirs.ps1 --
param([string]$path, [switch]$whatif)

Get-ChildItem $path -r | Where {$_.PSIsContainer -and !$(Get-ChildItem $_.fullname)} | 
    Remove-Item -WhatIf:$whatif

次に、次のように呼び出します。

PS> .\DeleteEmptyDirs c:\temp -WhatIf 
PS> .\DeleteEmptyDirs c:\temp
于 2013-01-03T02:30:50.630 に答える