I'm stumped.
I have a folder called c:/data/ToDelete. It used to contain files as well as a single subfolder called ..., which contained the same files as well as single subfolder named ... and this went on ad nauseum.
I moved the contents of the ToDelete folder elsewhere, but the subfolder/subfolder structure remains, and I can't get rid of it.
This is what it looks like in Explorer
This PC > Data > ToDelete > ... > ... > ... > ... > etc
clicking on the above reveals the path: C:\Data\ToDelete\
I was able to rename the first folder (from c:/data/temp/ to c:/data/ToDelete/) but whenever I try to rename the subfolder I get the "This folder is already open" (probably because it is just referring back to it's parent folder).
Things I've tried (none worked)
- the basics: Delete key, Shift Delete, drag to recycle bin, send to recycle bin
- command prompt delete, including trying the ASCII code for
.just in case. - I tried zipping it with 7zip
- I did a chkdsk and got no errors
- I tried removing with Revo Uninstaller Pro (the Delete folder option).
- I tried renaming the subfolders with this powershell script that I found online thinking I could then delete them but got an error:
Get-ChildItem -Recurse | where {$_.attributes -eq "Directory"} | Where-Object {$_.Name -match '...'} | Rename-Item -NewName { $_.Name -replace '...' , 'ToDelete' }
The funny thing is I found the folder in my backup directory as well, so somehow the entire thing can get copied (which means I have to remove it in multiple places now).
CodePudding user response:
You need to do two things to enable PowerShell to process files or folders literally named ...:
- Use
-LiteralPathinstead of-Pathparameter where possible, to prevent PowerShell from parsing the path. - Prepend
\\?\to the full path to tell the underlying Windows APIs to disable all string parsing and to send the string that follows it straight to the file system.
Example:
# For demonstration, create two nested sub folders literally named '...'
New-Item -ItemType Directory -Path '\\?\c:\data\ToDelete\...\...'
# Rename all '...' sub folders to 'ToDelete'
Get-ChildItem -LiteralPath '\\?\c:\data\ToDelete' -Directory -Recurse -Filter '...' |
Sort-Object { $_.Fullname.Length } -Desc |
Rename-Item -NewName ToDelete
- Before renaming the folders, we must sort by path length (descending) to make sure that deepest nested folders will be renamed first. Otherwise paths enumerated by
Get-ChildItemwould be incorrect after renaming the first folder.
For what you have tried:
- Note that
-match '...'doesn't find folders named literally like "...". The-matchoperator's RHS operand is a regular expression pattern and as such would match the first sequence of any three characters in the string. The same can be said about-replace '...'. To literally match "...", use-eq '...'or escape the dots like this when used in RegEx pattern:\.\.\.
