it-swarm.asia

كيفية حذف دليل كامل بشكل متكرر مع PowerShell 2.0؟

ما هي أبسط طريقة لحذف دليل وكل الأدلة الفرعية في PowerShell بالقوة؟ أنا أستخدم PowerShell V2 في نظام التشغيل Windows 7.

لقد تعلمت من عدة مصادر أن الأمر الأكثر وضوحًا ، Remove-Item $targetDir -Recurse -Force ، لا يعمل بشكل صحيح. يتضمن هذا بيانًا في تعليمات PowerShell V2 عبر الإنترنت (تم العثور عليه باستخدام Get-Help Remove-Item -Examples) ينص على:

... نظرًا لأن المعلمة Recurse في أمر cmdlet هذا خاطئة ، يستخدم الأمر أمر Get-Childitem cmdlet للحصول على الملفات المطلوبة ، ويستخدم عامل تشغيل خط الأنابيب لتمريرها إلى cmdlet Remove-Item ...

لقد رأيت العديد من الأمثلة التي تستخدم Get-ChildItem ووصّلها إلى Remove-Item ، لكن الأمثلة عادةً ما تزيل مجموعة من الملفات بناءً على عامل تصفية ، وليس الدليل بأكمله.

أنا أبحث عن أنظف طريقة لتفجير دليل كامل وملفات وأدلة فرعية ، دون إنشاء أي رسائل تحذير للمستخدم باستخدام أقل قدر من الشفرة. ستكون الخطوط الملاحية المنتظمة لطيفة إذا كان من السهل فهمها.

239
Matt Spradley
Remove-Item -Recurse -Force some_dir

هل حقا العمل كما هو معلن هنا.

rm -r -fo some_dir

هي الأسماء المستعارة المختصرة التي تعمل أيضًا.

بقدر ما فهمت ، المعلمة -Recurse فقط لا تعمل بشكل صحيح عند محاولة حذف مجموعة من الملفات التي تمت تصفيتها بشكل متكرر. لقتل دير واحد وكل شيء أدناه يبدو أنه يعمل بشكل جيد.

409
Joey

انا إستعملت:

rm -r folderToDelete

هذا يعمل لي مثل السحر (سرقته من أوبونتو).

36
Tuan Jinn

عند حذف الملفات بشكل متكرر باستخدام 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
19
John Rees

جرب هذا المثال. إذا كان الدليل غير موجود ، فلن يتم رفع أي خطأ. قد تحتاج إلى PowerShell v3.0.

remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue
10
steve
rm -r ./folder -Force    

... عملت لي

9
stevethecollier

استخدم أمر DOS للمدرسة القديمة:

rd /s <dir>
8
Anonymous

لتجنب أخطاء "الدليل غير فارغ" للإجابة المقبولة ، استخدم ببساطة أمر DOS القديم الجيد كما هو مقترح من قبل. بناء جملة PS الكامل جاهز للصق النسخ هو:

& cmd.exe /c rd /S /Q $folderToDelete
6
Dejan

لسبب ما ، لم تنجح إجابات جون ريس في حالتي. لكنها قادتني في الاتجاه التالي. أولاً ، أحاول حذف الدليل بشكل متكرر باستخدام خيار عربات التي تجرها الدواب. بعد ذلك ، إنحدر إلى كل subdir المتبقي وحذف جميع الملفات.

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
        }
    }
}
5
jdoose

لقد اتبعت مقاربة أخرى مستوحاة من @ 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 ، إليك لعبة getchya أخرى قد تضربك: https://superuser.com/q/212808

2
Peter McEvoy

يعمل حذف شجرة مجلد بأكملها أحيانًا وفشل أحيانًا مع وجود أخطاء "Directory not فارغة". إن محاولة التحقق ما إذا كان المجلد لا يزال موجودًا قد ينتج عنه أخطاء "وصول مرفوض" أو "وصول غير مصرح به". لا أعرف لماذا يحدث هذا ، على الرغم من إمكانية الحصول على بعض التبصر من نشر 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

كانت مقالة Microsoft TechNet استخدام الخصائص المحسوبة في PowerShell مفيدة لي في الحصول على قائمة بالمجلدات الفرعية مرتبة حسب العمق.

يمكن حل مشكلات الموثوقية المتشابهة مع RD/S/Q عن طريق تشغيل RD/S/Q مرتين - من الناحية المثالية مع توقف مؤقت بين (على سبيل المثال استخدام ping as ظاهر أدناه).

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
1
MikeOnline

حقا بسيط:

remove-item -path <type in file or directory name>, press Enter
1
DusanV

لحذف المحتويات الكاملة بما في ذلك استخدام بنية المجلد

get-childitem $dest -recurse | foreach ($_) {remove-item $_.fullname -recurse}

يضمن -recurse المضافة إلى remove-item تعطيل المطالبات التفاعلية.

1
steve simon
del <dir> -Recurse -Force # I prefer this, short & sweet

OR

remove-item <dir> -Recurse -Force

إذا كان لديك دليل ضخم فإن ما أقوم به عادة هو

while (dir | where name -match <dir>) {write-Host deleting; sleep -s 3}

تشغيل هذا على محطة بوويرشيل آخر ، وسوف يتوقف عندما يتم ذلك.

1
Gajendra D Ambi

خدعة أخرى مفيدة:

إذا وجدت الكثير من الملفات ذات اصطلاح مماثل أو مشابه (مثل ملف mac مع اسم بادئة نقطة ... سحب الملف الشهير) ، فيمكنك إزالتها بسهولة بسطر واحد من بوويرشيل مثل:

ls -r .* | rm

سيؤدي هذا السطر إلى إزالة جميع الملفات بنقطة في بداية الاسم داخل الدليل الحالي ، وجميع الملفات التي لها نفس الظروف داخل مجلدات أخرى داخل هذا الدليل أيضًا. كن على علم به عند استخدامه. :د

1
Daniel Alberto Lepe Ayala