380

PowerShell でディレクトリとそのすべてのサブディレクトリを強制的に削除する最も簡単な方法は何ですか? Windows 7 で PowerShell V2 を使用しています。

いくつかの情報源から、最も明白なコマンドでRemove-Item $targetDir -Recurse -Forceある が正しく機能しないことを知りました。これには、PowerShell V2 のオンライン ヘルプ ( を使用して見つかりましたGet-Help Remove-Item -Examples)の次のような記述が含まれます。

...このコマンドレットの Recurse パラメーターに問題があるため、コマンドは Get-Childitem コマンドレットを使用して目的のファイルを取得し、パイプライン演算子を使用してそれらを Remove-Item コマンドレットに渡します...

Get-ChildItemを使用してそれをRemove-Itemにパイプするさ​​まざまな例を見てきましたが、これらの例では通常、ディレクトリ全体ではなく、フィルターに基づいていくつかのファイル セットを削除します。

最小限のコードを使用してユーザー警告メッセージを生成せずに、ディレクトリ全体、ファイル、および子ディレクトリを吹き飛ばす最もクリーンな方法を探しています。ワンライナーでわかりやすいといいですね。

4

21 に答える 21

659
Remove-Item -Recurse -Force some_dir

ここで宣伝されているように実際に機能します。

rm -r -fo some_dir

も機能する省略形のエイリアスです。

私が理解している限り-Recurse、フィルター処理された一連のファイルを再帰的に削除しようとすると、パラメーターが正しく機能しません。単一のディレクトリとその下のすべてを殺すと、うまくいくようです。

于 2009-11-18T00:03:17.240 に答える
43

私が使用した:

rm -r folderToDelete

これは私にとって魅力のように機能します(Ubuntuから盗みました)。

于 2013-03-25T10:01:46.830 に答える
30

シンプルな方法でファイルを再帰的に削除するRemove-Item "folder" -Recurseと、断続的なエラーが表示されることがあります。[folder] cannot be removed because it is not empty.

この回答は、ファイルを個別に削除することにより、そのエラーを防止しようとします。

function Get-Tree($Path,$Include='*') { 
    @(Get-Item $Path -Include $Include -Force) + 
        (Get-ChildItem $Path -Recurse -Include $Include -Force) | 
        sort pspath -Descending -unique
} 

function Remove-Tree($Path,$Include='*') { 
    Get-Tree $Path $Include | Remove-Item -force -recurse
} 

Remove-Tree some_dir

重要な詳細はpspath -Descending、葉が根の前に削除されるように、すべてのアイテムをソートすることです。pspathファイルシステム以外のプロバイダーで機能する可能性が高いため、パラメーターで並べ替えが行われます。この-Includeパラメーターは、削除するアイテムをフィルター処理する場合に便利です。

実行して削除しようとしているものを確認すると便利なので、2つの機能に分割されています

Get-Tree some_dir | select fullname
于 2012-07-17T10:24:28.857 に答える
14
rm -r ./folder -Force    

...私のために働いた

于 2015-02-13T02:28:15.717 に答える
11

この例を試してください。ディレクトリが存在しない場合、エラーは発生しません。PowerShell v3.0 が必要な場合があります。

remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue
于 2014-11-30T06:19:49.923 に答える
10

昔ながらのDOSコマンドを使用します。

rd /s <dir>
于 2009-11-18T07:41:39.567 に答える
6

受け入れられた回答の「ディレクトリが空ではありません」というエラーを回避するには、以前に提案された古き良きDOSコマンドを使用するだけです。コピーして貼り付ける準備ができている完全な PS 構文は次のとおりです。

& cmd.exe /c rd /S /Q $folderToDelete
于 2016-02-26T12:54:08.230 に答える
2

上記の@john-reesに触発された別のアプローチを採用しました-特に、ある時点で彼のアプローチが失敗し始めたとき. 基本的にサブツリーを再帰し、パスの長さでファイルを並べ替えます - 最長から最短の順に削除します

Get-ChildItem $tfsLocalPath -Recurse |  #Find all children
    Select-Object FullName,@{Name='PathLength';Expression={($_.FullName.Length)}} |  #Calculate the length of their path
    Sort-Object PathLength -Descending | #sort by path length descending
    %{ Get-Item -LiteralPath $_.FullName } | 
    Remove-Item -Force

-LiteralPath マジックに関して、あなたを襲っている可能性のある別の問題があります: https://superuser.com/q/212808

于 2016-08-02T10:14:02.107 に答える
2

Remove-Item -Force -Recurse基盤となるファイルシステムが非同期であるため、Windows で断続的に失敗する問題があるようです。この答えはそれに対処しているようです。ユーザーは、GitHubの Powershell チームにも積極的に参加しています。

于 2020-08-04T15:49:24.440 に答える