পাওয়ারশেলের ফাইল ও ডিরেক্টরিগুলি জোর করে অপসারণ কখনও কখনও ব্যর্থ হয় তবে সর্বদা হয় না


33

আমি পুনরাবৃত্তভাবে ডিরেক্টরিটি মুছে ফেলার চেষ্টা করছি rm -Force -Recurse somedirectory, বেশ কয়েকটি "ডিরেক্টরি খালি নয়" ত্রুটি পেয়েছি get যদি আমি একই কমান্ডটি আবার চেষ্টা করি তবে এটি সফল হয়।

উদাহরণ:

PS I:\Documents and Settings\m\My Documents\prg\net> rm -Force -Recurse .\FileHelpers
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data\RunTime\_svn: The directory is not empty.
At line:1 char:3
+ rm <<<<  -Force -Recurse .\FileHelpers
    + CategoryInfo          : WriteError: (_svn:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data\RunTime: The directory is not empty.
At line:1 char:3
+ rm <<<<  -Force -Recurse .\FileHelpers
    + CategoryInfo          : WriteError: (RunTime:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data: The directory is not empty.
At line:1 char:3
+ rm <<<<  -Force -Recurse .\FileHelpers
    + CategoryInfo          : WriteError: (Data:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests: The directory is not empty.
At line:1 char:3
+ rm <<<<  -Force -Recurse .\FileHelpers
    + CategoryInfo          : WriteError: (FileHelpers.Tests:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs\nunit\_svn: The directory is not empty.
At line:1 char:3
+ rm <<<<  -Force -Recurse .\FileHelpers
    + CategoryInfo          : WriteError: (_svn:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs\nunit: The directory is not empty.
At line:1 char:3
+ rm <<<<  -Force -Recurse .\FileHelpers
    + CategoryInfo          : WriteError: (nunit:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs: The directory is not empty.
At line:1 char:3
+ rm <<<<  -Force -Recurse .\FileHelpers
    + CategoryInfo          : WriteError: (Libs:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers: The directory is not empty.
At line:1 char:3
+ rm <<<<  -Force -Recurse .\FileHelpers
    + CategoryInfo          : WriteError: (I:\Documents an...net\FileHelpers:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
PS I:\Documents and Settings\m\My Documents\prg\net> rm -Force -Recurse .\FileHelpers
PS I:\Documents and Settings\m\My Documents\prg\net>

অবশ্যই, এটি সবসময় ঘটে না । এছাড়াও, এটি কেবল _svnডিরেক্টরিগুলির সাথেই ঘটে না এবং আমার কোনও টরটোইজএসভিএন ক্যাশে বা এর মতো কিছু নেই তাই ডিরেক্টরিটি কোনও কিছুই ব্লক করে না।

কোন ধারনা?

উত্তর:


31

help Remove-Item বলেছেন:

এই সেমিডলেটে রিকার্স প্যারামিটারটি সঠিকভাবে কাজ করে না।

এবং

যেহেতু এই সেমিডলেটে রিকার্স প্যারামিটারটি ত্রুটিযুক্ত, কমান্ডটি আকাঙ্ক্ষা ডি ফাইলগুলি পাওয়ার জন্য গেট-চাইল্ডেম সেমিডলেট ব্যবহার করে এবং এটি পাইপলাইন অপারেটরটিকে সেগুলি সরান-আইটেমের সেমিড্লেটে পাস করার জন্য ব্যবহার করে।

এবং একটি বিকল্প হিসাবে এই বিকল্প প্রস্তাব:

get-childitem * -include *.csv -recurse | remove-item

সুতরাং আপনি পাইপ get-childitem -recurseকরা উচিত remove-item


ধন্যবাদ। 2006 থেকে স্রেফ এই থ্রেডটি খুঁজে পেয়েছে: vistax64.com/powershell/… দেখে মনে হচ্ছে মাইক্রোসফ্ট এটি ঠিক করতে সত্যিই আগ্রহী নয়।
মৌরিসিও শেফার

@ মাশচ: এটি আরও সাম্প্রতিক, তবে এখনও সমাধান না হওয়া, রেফারেন্স দেখুন: সরান-আইটেম-রেকর্ড
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত

যদি আপনি একটি ট্র্যাভারসাল করেন এবং মুছুন, আপনাকে প্রথমে শিশু ডিরেক্টরিগুলি এবং তাদের ফাইলগুলি প্রথমে অতিক্রম করতে হবে।
fschwiet

2
কমপক্ষে ডকুমেন্টেশন বলছে এটি কাজ করে না।
derekerdmann

6
আমাকে সরান-আইটেমের জন্য দুটি বল প্রয়োগ করতে হয়েছিল, অন্যথায় এটি আমাকে "অনুগ্রহ করে" নিশ্চিত করুন "গিটার-চাইল্ড আইটেম -পথ $ গন্তব্য-তদন্ত | সরান-আইটেম-বলুন-রেকর্ড
MiFreidgeim

17

@ জেমসসিডব্লিউ: পাওয়ারশেল ৪.০ এ এখনও সমস্যাটি রয়েছে

আমি আরও একটি কাজ করার চেষ্টা করেছি এবং এটি কাজ করেছে: cmd.exe ব্যবহার করুন:

&cmd.exe /c rd /s /q $somedirectory

1
ভাল পুরানো আরডি / এস / কিউ!
জেমসসিডাব্লু

আমি গেট-চাইল্ড আইটেমের প্রতিটি পরিবর্তনের চেষ্টা করেছি; পুনরায় চেষ্টা করুন লুপস; iisresetমোছার আগে কল করা এবং কোনও কিছুই নির্ভরযোগ্যভাবে কাজ করছে বলে মনে হয় না । আমি এটি চেষ্টা করব, যদিও আমি যখন প্রথম দেখলাম আমি আমার পাওয়ারশেলের ভিতরে ডস রেখেছিলাম ...
পিটার ম্যাকভয়ে

দুর্ভাগ্যক্রমে, rd /sমাঝে মাঝে খুব ব্যর্থ হয় (যদিও প্রায়শই কম দেখা যায় Remove-Item): github.com/Mic Microsoft
issues

এটি আমার পক্ষে সি দ্বারা স্ল্যাশ পছন্দ করে না। আপনার কি এটিকে পাওয়ারশেল-কম্যান্ড এবং একক উদ্ধৃতিটি সেমিডি.এক্স অংশ দ্বারা পূর্বে করতে হবে? আমি "আপনাকে অবশ্যই '/' অপারেটরের অনুসরণ করে একটি মান প্রকাশ করতে হবে" " "অভিব্যক্তি বা বিবৃতিতে অপ্রত্যাশিত টোকেন 'সি'। সামনে পাওয়ারশেল-কম্যান্ডের সাথেও এটি একই। / কী পালানোর দরকার আছে?
মিশেল

7

ETA 20181217: PSVersion 4.0 এবং তারপরেও কিছু পরিস্থিতিতে ব্যর্থ হবে, মেহেরদাদ মিররেজার বিকল্প উত্তর এবং এমকেলেট দ্বারা দায়ের করা বাগ রিপোর্ট দেখুন

mklement এই সময়ে ধারণা সমাধানের একটি প্রুফ উপলব্ধ এইরকম উত্তর দেন যেমন বাগ একটি সরকারী ফিক্স জন্য অপেক্ষা করছে,

PowerShell( PSVersion 4.0) এর নতুন সংস্করণটি এই সমস্যাটিকে পুরোপুরি সমাধান করেছে এবং Remove-Item "targetdirectory" -Recurse -Forceসময়োচিত সমস্যা ছাড়াই কাজ করে।

আপনি $PSVersiontableআইএসই বা PowerShellপ্রম্পটের মধ্যে থেকে চালিয়ে আপনার সংস্করণটি পরীক্ষা করতে পারেন । ৪.০ হ'ল সংস্করণ যা দিয়ে পাঠানো হয় Windows 8.1এবং Server 2012 R2এটি উইন্ডোজের পূর্ববর্তী সংস্করণগুলিতেও ইনস্টল করা যেতে পারে।


5
এখনও পাওয়ারশেল 4.0-এ আমার জন্য ঘটে
আজবিয়ান

10
তবুও পাওয়ারশেল ভি 5 তে ঘটে !!!!! 11 !! 1! 1 !!!
রিচার্ড হাউয়ার

@ রিচার্ডহৌর ভাল এখন আমি কেবল বিভ্রান্ত
জেমস সিডব্লিউ

2
@ জেমসসিডাব্লু আমি rdসংস্করণে রূপান্তর করেছি । প্রকৃতপক্ষে কাজ করা বাদে, এটি প্রায় 3x দ্রুত
রিচার্ড হাউর

উইন্ডোজ পাওয়ারশেল v5.1 / পাওয়ারশেল কোর 6.2.0-প্রাকদর্শন.1 হিসাবে সমস্যাটি ঠিক করা হয়নি - এই বাগ রিপোর্টটি দেখুন । যদিও rd /sপ্রায়শই কম ব্যর্থ হতে পারে, এটিও ভেঙে গেছে - এই বাগের প্রতিবেদনটি দেখুন
এমকিলেমেন্ট

4

আপডেট : আপাতদৃষ্টিতে উইন্ডোজ ফাইল সিস্টেম-আইটেম অপসারণের এপিআইগুলি সিঙ্ক্রোনাস করার পরিকল্পনা রয়েছে তবে উইন্ডোজ 10 সংস্করণ 1903 অনুযায়ী সেগুলি এখনও সিঙ্ক্রোনাস নয় - গিটহাবের এই মন্তব্যটি দেখুন ।


বিদ্যমান উত্তরগুলি সমস্যাটি হ্রাস করে, যাতে এটি ঘন ঘন ঘটে থাকে তবে তারা মূল কারণটিকে চিহ্নিত করে না, এজন্য ব্যর্থতা এখনও ঘটতে পারে।

Remove-Item -Recurseঅপ্রত্যাশিতভাবে অ্যাসিনক্রোনাস , শেষ পর্যন্ত কারণ ফাইল এবং ডিরেক্টরি সরানোর উইন্ডোজ এপিআই পদ্ধতিগুলি সহজাতভাবে অ্যাসিনক্রোনাস এবং এর Remove-Itemজন্য অ্যাকাউন্ট হয় না।

এটি মাঝে মাঝে , অপ্রত্যাশিতভাবে দুটি উপায়ে একটিতে উদ্ভাসিত হয়:

  • আপনার ক্ষেত্রে: কোনও মাইন্ডোরিটি ডিরেক্টরি মুছে ফেলা নিজেই ব্যর্থ হতে পারে, যদি এটির মধ্যে একটি উপ-ডিরেক্টরি বা ফাইল অপসারণ প্যারেন্ট ডিরেক্টরিটি সরানোর চেষ্টা করার সময় না পেরে এখনও শেষ না হয়।

  • কম সাধারণ: অপসারণের অবিলম্বে মুছে ফেলা ডিরেক্টরিটি পুনরায় তৈরি করা ব্যর্থ হতে পারে, কারণ পুনরায় তৈরির চেষ্টা করার পরেও অপসারণটি এখনও সম্পূর্ণ হয়নি।

সমস্যা শুধুমাত্র PowerShell এর না প্রভাবিত Remove-Item, কিন্তু cmd.exe's rd /s.NET এর পাশাপাশি[System.IO.Directory]::Delete() :

উইন্ডোজ পাওয়ারশেল v5.1 / পাওয়ারশেল কোর হিসাবে 6.2.0-পূর্বরূপ.1 / cmd.exe10.0.17134.407 /। নেট ফ্রেমওয়ার্ক 4.7.03056, নেট নেট 2.1, না Remove-Item, এবং rd /sনা [System.IO.Directory]::Delete()নির্ভরযোগ্যভাবে কাজ করে না , কারণ তারা অ্যাসিঙ্ক্রোনাসের জন্য অ্যাকাউন্টে ব্যর্থ হয় উইন্ডোজ এপিআই ফাইল / ডিরেক্টরি-অপসারণ ফাংশনগুলির আচরণ :

নির্ভরযোগ্যভাবে সিঙ্ক্রোনাস ওয়ার্কআরাউন্ড সরবরাহ করে এমন একটি কাস্টম পাওয়ারশেল ফাংশনের জন্য , এই এই উত্তরটি দেখুন


ফাইলগুলি পরিচালনা করার সময় যেখানে অপসারণ নিশ্চিত:while($true) { if ( (Remove-Item [...] *>&1) -ne $null) { Start-Sleep 0.5 } else { break } }
ফারওওয়ে

3

বর্তমান উত্তরটি আসলে কোনও ডিরেক্টরি মুছবে না, কেবল তার শিশুরা। অধিকন্তু এটি নেস্টেড ডিরেক্টরিতে সমস্যা হতে পারে কারণ এটি আবার কোনও ডিরেক্টরি এর সামগ্রীর আগে মুছে ফেলার চেষ্টা করবে। আমি ফাইলগুলিকে সঠিক ক্রমে মুছে ফেলার জন্য কিছু লিখেছি, এখনও একই সমস্যা থাকবে যদিও মাঝে মাঝে ডিরেক্টরিটি পরে থাকে।

সুতরাং, এখন আমি এমন কিছু ব্যবহার করি যা ব্যতিক্রম, অপেক্ষা এবং পুনরায় চেষ্টা করবে (3 বার):

আপাতত আমি এটি ব্যবহার করছি:

function EmptyDirectory($directory = $(throw "Required parameter missing")) {

    if ((test-path $directory) -and -not (gi $directory | ? { $_.PSIsContainer })) {
        throw ("EmptyDirectory called on non-directory.");
    }

    $finished = $false;
    $attemptsLeft = 3;

    do {
        if (test-path $directory) {
            rm $directory -recurse -force
        }

        try {
            $null = mkdir $directory
            $finished = $true
        } 
        catch [System.IO.IOException] {
            Start-Sleep -Milliseconds 500
        }

        $attemptsLeft = $attemptsLeft - 1;
    } 
    while (-not $finished -and $attemptsLeft -gt 0)

    if (-not $finished) {
        throw ("Unable to clean and recreate directory " + $directory)
    }
}

1
এটি ভাল তবে আমার এটির সাথে এখনও সমস্যা ছিল। সিস্টেমটি আরএম কমান্ডটি সম্পন্ন করার আগে যদি mkdir কমান্ডটি চালিত হয় তবে এটি একটি সিস্টেম নিক্ষেপ করতে পারে tem অর্থাৎ, ডিরেক্টরিটি এখনও ওএস দ্বারা মুছে ফেলা হয়নি (আমার ধীর এইচডিডি তে)। সুতরাং সেই ত্রুটিটিও ধরা দরকার। এবং এটি একটি নন-টার্মিনেটিং ত্রুটি, সুতরাং ত্রুটিঅ্যাকশনটি থামাতে হবে needs আমি চেষ্টা করেও ব্লকের মধ্যে আরএম কমান্ডটি রেখেছি, মোছার সময় কেবল ক্ষণস্থায়ী আইও ত্রুটি রয়েছে।
মার্ক লাপিয়ার

আমি বিশ্বাস করতে পারি না এমনকি এটি করাও হয়েছে। অভিশাপ, পাওয়ারশেল চুষে!
jcollum

3

ডিরেক্টরি মুছতে এবং এর বিষয়বস্তু দুটি পদক্ষেপ নেয়। প্রথমে সামগ্রীগুলি মুছুন, তারপরে ফোল্ডারটি নিজেই। ত্রুটিযুক্ত পুনরাবৃত্তির অপসারণ আইটেমটির জন্য সমাধানটি সমাধানটির মতো দেখতে পাবেন:

Get-ChildItem -Path "$folder\\*" -Recurse | Remove-Item -Force -Recurse
Remove-Item $folder

এইভাবে আপনি পিতামহুল ডিরেক্টরিটিও মুছে ফেলতে পারেন।


1
গ্রহণযোগ্য উত্তরটি ঠিক তাই বলেছিল। আপনার যোগ করার মতো কিছু আছে?
মাইকেল হ্যাম্পটন

1
তারা নির্দেশ করছে যে স্বীকৃত উত্তর ডিরেক্টরিটি নিজেই মুছবে না, সুতরাং এটি দুটি পদক্ষেপ নেয়।
পল জর্জ

2
Remove-Itemআপনার পাইপিংটি যে কমান্ডটি প্রবর্তিত হয়েছে তেমন একই সমস্যা রয়েছে। এটি কোনও ডিরেক্টরি আইটেমে হোঁচট খেতে পারে যা একইভাবে খালি নয়।
দেজন

@ দেজন এই ডিরেক্টরিটি এখনও খালি থাকতে পারত না যদি এই কোডের প্রথম লাইনটি কাজ করে, এটি কি পারে?
ইফেদী ওকনকভো

1
যদিও এটি ব্যর্থতার সম্ভাবনা হ্রাস করতে পারে তবুও এটি Remove-Item -Recurseজড়িত থাকলেও এটি ব্যর্থ হতে পারে । অন্তর্নিহিত সমস্যাটি এখনও উইন্ডোজ পাওয়ারশেল v5.1 / পাওয়ারশেল কোর 6.2.0-পূর্বরূপ.1 হিসাবে বিদ্যমান - এই বাগ রিপোর্টটি দেখুন
এমকিলেমেন্ট

3

ভগবান। প্রচুর উত্তর। আমি সত্যই তাদের সকলের চেয়ে এটি পছন্দ করি। এটি দুর্দান্ত, সম্পূর্ণ, পঠনযোগ্য এবং যে কোনও উইন্ডোজ মেশিনে কাজ করে। এটি। নেট (বিশ্বাসযোগ্য) পুনরাবৃত্তির মোছার কার্যকারিতা ব্যবহার করে এবং এটি যদি কোনও কারণে ব্যর্থ হয় তবে এটি একটি যথাযথ ব্যতিক্রম ছোঁড়ে যা চেষ্টা / ক্যাপ ব্লক দিয়ে পরিচালনা করা যায়।

$fullPath = (Resolve-Path "directory\to\remove").ProviderPath
[IO.Directory]::Delete($fullPath, $true)

লক্ষ করুন যে Resolve-Pathলাইনটি গুরুত্বপূর্ণ কারণ আপেক্ষিক ফাইল পাথগুলি সমাধান করার সময় .NET আপনার বর্তমান ডিরেক্টরি সম্পর্কে অবগত নয়। এটাই আমি ভাবতে পারি একমাত্র গোচা সম্পর্কে about


2

এই আমি কাজ করে যাচ্ছি:

$Target = "c:\folder_to_delete"

Get-ChildItem -Path $Target -Recurse -force |
  Where-Object { -not ($_.psiscontainer) } |
   Remove-Item Force

Remove-Item -Recurse -Force $Target

এই প্রথম লাইনটি গাছের সমস্ত ফাইল মুছে দেয়। দ্বিতীয়টি শীর্ষ সহ সমস্ত ফোল্ডার মুছে দেয়।


যদিও এটি ব্যর্থতার সম্ভাবনা হ্রাস করতে পারে তবুও এটি Remove-Item -Recurseজড়িত থাকলেও এটি ব্যর্থ হতে পারে । অন্তর্নিহিত সমস্যাটি এখনও উইন্ডোজ পাওয়ারশেল v5.1 / পাওয়ারশেল কোর 6.2.0-পূর্বরূপ.1 হিসাবে বিদ্যমান - এই বাগ রিপোর্টটি দেখুন
এমকিলেমেন্ট


0

মুছে ফেলা হবে না এমন একটি ডিরেক্টরি নিয়ে আমার এই সমস্যা ছিল। আমি দেখতে পেলাম যে সাব-ফোল্ডারগুলির মধ্যে একটি দুর্নীতিগ্রস্থ ছিল এবং যখন আমি সেই শিশু দির সরিয়ে নেওয়ার বা নতুন নামকরণের চেষ্টা করলাম তখন আমি এটির অনুপস্থিত থাকার বিষয়ে কিছু বলতে একটি ত্রুটি বার্তা পেয়েছি। আমি আরএম-ফর্স ব্যবহার করার চেষ্টা করেছি এবং আপনার মতো একই ত্রুটি পেয়েছি।

আমার জন্য যা কাজ করেছে তা হ'ল "সংকোচনের পরে ফাইলগুলি মুছুন" বিকল্পের সাহায্যে 7-জিপ ব্যবহার করে পিতামাতার দিরকে সংকুচিত করা হয়েছিল। এটি সঙ্কুচিত হয়ে গেলে আমি জিপ ফাইলটি মুছতে সক্ষম হয়েছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.