再帰のPowerShell 2.0でディレクトリ全体を削除するには?
-
20-09-2019 - |
質問
強制PowerShellでディレクトリとそのすべてのサブディレクトリを削除する最も簡単な方法は何ですか?私は、Windows 7でPowerShellのV2を使用しています。
私が最も明白なコマンド、Remove-Item $targetDir -Recurse -Force
は、正常に動作しないことをいくつかのソースから学んできました。これは述べて(Get-Help Remove-Item -Examples
を使用しています)のPowerShell V2オンラインヘルプの文が含まれます:
...このコマンドレットのRecurseパラメーターが故障しているので、コマンドは、目的のファイルを取得するには、Get-ChildItemコマンドレットを使用して、そしてそれは、Remove-Itemコマンドレットに渡すためにパイプライン演算子を使用しています...
私はのを削除し、項目にある[は、Get-ChildItemコマンドレットをパイプそれを使用する様々な例を見てきましたが、例は、通常は、フィルタに基づいてファイルのいくつかのセットをしませ削除しますディレクトリ全体ます。
私は、コードの最低額を使用して、任意のユーザーの警告メッセージを生成せずに、全体のディレクトリ、ファイルや子ディレクトリを吹き飛ばすためにクリーンな方法を探しています。理解しやすい場合はワンライナーはいいだろう。
解決
Remove-Item -Recurse -Force some_dir
ここでの宣伝として実際に動作します。
rm -r -fo some_dir
は、あまりにも仕事速記別名です。
あなたは再帰的にファイルのフィルタセットを削除しようとすると、私の知る限りそれを理解できるように、-Recurse
パラメータだけで正常に動作しません。以下、単一dirと、すべてを殺すために、正常に動作するようです。
他のヒント
私が使用します:
rm -r folderToDelete
このは(私はUbuntuのからそれを盗んだ)魔法のように私のために動作します。
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
パラメータは、削除するアイテムをフィルタ処理したい場合は、単に便利です。
これは、二つの機能に分かれています。
Get-Tree some_dir | select fullname
rm -r ./folder -Force
...
私のために働きましたこの例を試してみてください。ディレクトリが存在しない場合、エラーは発生しません。あなたは、PowerShellのV3.0が必要な場合があります。
remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue
古い学校DOSコマンドを使用します:
rd /s <dir>
の前に提案されているよう単に古き良きDOSコマンドを使用し、受け入れ答えの「ディレクトリが空ではありません」エラーを回避するには。コピー&ペーストの準備ができて完全なPSの構文は次のとおりです。
& cmd.exe /c rd /S /Q $folderToDelete
何らかの理由でジョン・リース答えは時々私の場合には動作しませんでした。しかし、それは、次の方向に私を導きました。 最初に私はバギー-recurseオプションを使用して再帰的にディレクトリを削除してみてください。その後私は左と、すべてのファイルを削除していますすべてのサブディレクトリに降ります。
function Remove-Tree($Path)
{
Remove-Item $Path -force -Recurse -ErrorAction silentlycontinue
if (Test-Path "$Path\" -ErrorAction silentlycontinue)
{
$folders = Get-ChildItem -Path $Path –Directory -Force
ForEach ($folder in $folders)
{
Remove-Tree $folder.FullName
}
$files = Get-ChildItem -Path $Path -File -Force
ForEach ($file in $files)
{
Remove-Item $file.FullName -force
}
if (Test-Path "$Path\" -ErrorAction silentlycontinue)
{
Remove-Item $Path -force
}
}
}
私は上記の@ジョン・リースに触発された別のアプローチを取った - 彼のアプローチはいくつかの点で私のために失敗し始めた場合は特に。基本的にサブツリーを再帰的に、その経路長でファイルを並べ替える - 最長から
最短に削除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の魔法については、ここであなたを打つことができる別のgotchyaです: https://superuser.com/q/212808
本当に簡単ます:
remove-item -path <type in file or directory name>, press Enter
の他の有用なトリック:の
あなたは、あなたが簡単にこのようなPowerShellのから1つのラインでそれらを削除することができます(ドットプレフィックス名...あの有名なファイルpulltionを搭載したMacのファイルのような)同一または類似の命名規則を持つたくさんのファイルを見つけた場合:
ls -r .* | rm
この行は、現在のディレクトリ内の名前の初めのドット、そしてあまりにもこのディレクトリ内の他のフォルダ内の同じ状況であるすべてのファイルとすべてのファイルを削除しようとしています。それを使用している場合、それについて注意してください。 :D
全体フォルダツリーは時々動作し、時には「ディレクトリが空でない」というエラーで失敗し削除。その後、フォルダがまだ存在するかどうかを確認しようとすると「アクセスが拒否されました」または「不正アクセス」エラーが発生することができます。これがなぜ起こるか、いくつかの洞察力は、このStackOverflowのがの投稿のから得られるかもしれませんが、私は、知りません。
私は、フォルダ内の項目が削除される順序を指定することにより、および遅延を追加することにより、これらの問題を回避することができました。以下は私のためにうまく動作します:
# First remove any files in the folder tree
Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Where-Object { -not ($_.psiscontainer) } | Remove-Item –Force
# Then remove any sub-folders (deepest ones first). The -Recurse switch may be needed despite the deepest items being deleted first.
ForEach ($Subfolder in Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Select-Object FullName, @{Name="Depth";Expression={($_.FullName -split "\\").Count}} | Sort-Object -Property @{Expression="Depth";Descending=$true}) { Remove-Item -LiteralPath $Subfolder.FullName -Recurse -Force }
# Then remove the folder itself. The -Recurse switch is sometimes needed despite the previous statements.
Remove-Item -LiteralPath $FolderToDelete -Recurse -Force
# Finally, give Windows some time to finish deleting the folder (try not to hurl)
Start-Sleep -Seconds 4
PowerShellでの計算プロパティを使用して、Microsoft TechNetの記事は参考になりました深さによってソートされたサブ・フォルダのリストを得ることに私には。
同様の信頼性の問題の RD / S / Q のの RD / S / Q を二回実行することによって解決することができます - 使用して(つまり、間に理想的で一時停止を<強いです>ピング)以下に示すようにの
RD /S /Q "C:\Some\Folder\to\Delete" > nul
if exist "C:\Some\Folder\to\Delete" ping -4 -n 4 127.0.0.1 > nul
if exist "C:\Some\Folder\to\Delete" RD /S /Q "C:\Some\Folder\to\Delete" > nul
フォルダ構造の使用を含む内容を完全に削除するには、
get-childitem $dest -recurse | foreach ($_) {remove-item $_.fullname -recurse}
-recurse
に追加remove-item
は、対話型のプロンプトが無効になっている保証します。
del <dir> -Recurse -Force # I prefer this, short & sweet
または
remove-item <dir> -Recurse -Force
あなたは巨大なディレクトリを持っている場合、私は通常、何をすべきか。
while (dir | where name -match <dir>) {write-host deleting; sleep -s 3}
他のPowerShellの端末上でこれを実行し、それが行われたときに停止します。
$users = get-childitem \\ServerName\c$\users\ | select -ExpandProperty name
foreach ($user in $users)
{
remove-item -path "\\Servername\c$\Users\$user\AppData\Local\Microsoft\Office365\PowerShell\*" -Force -Recurse
Write-Warning "$user Cleaned"
}
親ディレクトリを削除せずに、いくつかのログファイルをきれいにするために、上記を書き、これは完璧に動作します!
rm -r <folder_name>
c:\>rm -r "my photos"