260자 제한에 상관없이 디렉토리 삭제
일정일 후 USMT 마이그레이션 폴더를 삭제하기 위한 간단한 스크립트를 작성합니다.
## Server List ##
$servers = "Delorean","Adelaide","Brisbane","Melbourne","Newcastle","Perth"
## Number of days (-3 is over three days ago) ##
$days = -3
$timelimit = (Get-Date).AddDays($days)
foreach ($server in $servers)
{
$deletedusers = @()
$folders = Get-ChildItem \\$server\USMT$ | where {$_.psiscontainer}
write-host "Checking server : " $server
foreach ($folder in $folders)
{
If ($folder.LastWriteTime -lt $timelimit -And $folder -ne $null)
{
$deletedusers += $folder
Remove-Item -recurse -force $folder.fullname
}
}
write-host "Users deleted : " $deletedusers
write-host
}
그러나 나는 계속 두려움에 부딪힙니다.Remove-Item : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
해결책과 대안을 찾아봤지만 모두 폴더 안에 있는 것을 신경 쓰며 제 주변을 맴돌고 있습니다.
삭제 표시가 되어 있으면 폴더 내용은 별로 신경 쓰지 않기 때문에 좀 더 간단한 해결책을 기대하고 있었습니다.
Remove-Item-recurse 외에 내가 추구하는 것을 달성할 수 있는 네이티브 파워셸 cmdlet이 있습니까?
노드 프로젝트와 관련하여 종종 이 문제가 발생합니다.그들은 자신들의 종속성을 내포하고 일단 복제되면, 그것들을 삭제하는 것은 어렵습니다.제가 발견한 좋은 노드 유틸리티는 림라프(rimraf입니다.
npm install rimraf -g
rimraf <dir>
CADII가 또 다른 답변에서 말했듯이: 로보카피는 260자로 제한된 길이보다 더 긴 경로를 만들 수 있습니다.로보카피는 이러한 경로도 삭제할 수 있습니다.삭제할 경우에는 너무 긴 이름을 포함한 빈 폴더를 경로에 미러링하면 됩니다.
예를 들어,
robocopy C:\temp\some_empty_dir E:\temp\dir_containing_very_deep_structures /MIR
다음은 매개 변수와 다양한 옵션을 알기 위한 로보카피 참조입니다.
위에 언급된 로보카피 기법을 사용하여 긴 경로(>260)를 삭제할 수 있는 PowerShell 함수를 만들었습니다.
function Remove-PathToLongDirectory
{
Param(
[string]$directory
)
# create a temporary (empty) directory
$parent = [System.IO.Path]::GetTempPath()
[string] $name = [System.Guid]::NewGuid()
$tempDirectory = New-Item -ItemType Directory -Path (Join-Path $parent $name)
robocopy /MIR $tempDirectory.FullName $directory | out-null
Remove-Item $directory -Force | out-null
Remove-Item $tempDirectory -Force | out-null
}
사용 예:
Remove-PathToLongDirectory c:\yourlongPath
SuperUser에 대한 이 답변이 해결해 주었습니다: https://superuser.com/a/274224/85532
Cmd /C "rmdir /S /Q $myDir"
긴 파일 경로 문제를 해결하기 위해 종종 작동하는 요령을 조금 전에 배웠습니다.일부 Windows API를 사용할 때 특정 기능은 긴 파일 이름을 처리할 수 없는 레거시 코드에 흐르게 됩니다.그러나 특정한 방법으로 경로를 포맷하는 경우 레거시 코드는 사용되지 않습니다.이 문제를 해결하는 방법은 "\\?"를 사용하여 경로를 참조하는 것입니다.\" 접두사를 붙입니다모든 API가 이것을 지원하는 것은 아니지만, 이 특정한 경우에는 이것이 나에게 효과가 있었다는 것을 주목해야 합니다. 아래의 나의 예를 참조하십시오.
다음 예제는 실패합니다.
PS D:\> get-childitem -path "D:\System Volume Information\dfsr" -hidden
Directory: D:\System Volume Information\dfsr
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a-hs 10/09/2014 11:10 PM 834424 FileIDTable_2
-a-hs 10/09/2014 8:43 PM 3211264 SimilarityTable_2
PS D:\> Remove-Item -Path "D:\System Volume Information\dfsr" -recurse -force
Remove-Item : The specified path, file name, or both are too long. The fully qualified file name must be less than 260
characters, and the directory name must be less than 248 characters.
At line:1 char:1
+ Remove-Item -Path "D:\System Volume Information\dfsr" -recurse -force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (D:\System Volume Information\dfsr:String) [Remove-Item], PathTooLongExcepti
on
+ FullyQualifiedErrorId : RemoveItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
PS D:\>
그러나 경로 앞에 "\\"를 붙입니까?\" 명령을 성공적으로 작동시킵니다.
PS D:\> Remove-Item -Path "\\?\D:\System Volume Information\dfsr" -recurse -force
PS D:\> get-childitem -path "D:\System Volume Information\dfsr" -hidden
PS D:\>
루비가 설치되어 있는 경우 파일맨을 사용할 수 있습니다.
gem install fileman
설치가 완료되면 명령 프롬프트에서 간단히 다음을 실행할 수 있습니다.
fm rm your_folder_path
이 문제는 Windows에서 node.js로 개발할 때 정말 골치 아픈 문제이므로 파일맨은 때때로 모든 가비지를 삭제할 수 있습니다.
이는 알려진 제한 사항입니다.PowerShell
. 그 주변의 일은 사용하는 것입니다.dir
cmd (미안하지만 이것은 사실입니다.
http://asysadmin.tumblr.com/post/17654309496/powershell-path-length-limitation
또는 AaronH에서 언급한 대로 \?\ 구문을 사용하여 빌드를 삭제합니다.
dir -Include build -Depth 1 | Remove-Item -Recurse -Path "\\?\$($_.FullName)"
당신이 하는 일이 파일을 삭제하는 것뿐이라면, 저는 이름을 줄이는 기능을 사용한 다음 삭제합니다.
function ConvertTo-ShortNames{
param ([string]$folder)
$name = 1
$items = Get-ChildItem -path $folder
foreach ($item in $items){
Rename-Item -Path $item.FullName -NewName "$name"
if ($item.PSIsContainer){
$parts = $item.FullName.Split("\")
$folderPath = $parts[0]
for ($i = 1; $i -lt $parts.Count - 1; $i++){
$folderPath = $folderPath + "\" + $parts[$i]
}
$folderPath = $folderPath + "\$name"
ConvertTo-ShortNames $folderPath
}
$name++
}
}
오래된 질문인 건 알지만, 누군가 필요할 경우를 대비해서 여기에 놓아두려고 생각했습니다.
실험을 사용하는 한 가지 해결 방법이 있습니다.Base Class Libraries 프로젝트의 IO.포쉬코드에서 찾을 수도 있고, 작가의 블로그에서 다운받을 수도 있습니다.260 한계는 에서 도출됩니다.NET, 즉, 의존하지 않는 툴을 사용하거나 둘 중 하나입니다.NET(라이크)cmd /c dir
, @빌이 제안한 대로).
도구 조합이 가장 잘 작동할 수 있으므로 대신 dir/x를 실행하여 8.3 파일 이름을 가져오십시오.그런 다음 출력을 텍스트 파일로 구문 분석한 다음 파워셸 스크립트를 구축하여 아웃파일한 경로를 삭제할 수 있습니다.1분 내내 당신을 데려가세요.또는 8.3 파일 이름을 더 짧은 것으로 변경하거나 삭제할 수도 있습니다.
저의 로보카피는 1,2,3에서 작업했습니다.
- 먼저 빈 디렉토리를 생성하고 c:\emptydir라고 합니다.
- 로보카피 c:\emptydir c:\directory를 삭제/제거할 수 있습니다.
- rmdir c:\directory를 삭제합니다.
이것은 오래되었지만 최근에 다시 해결해야 했습니다.이 PC에서 실행 중인 다른 모듈이나 기능을 사용할 필요가 없어 결국 'subst'를 사용하게 되었습니다.좀 더 휴대성이 좋은.
기본적으로 예비 드라이브 문자를 찾아 해당 문자로 가는 긴 경로를 '대체'한 다음 GCI의 기준으로 사용합니다.
제한 사항은 $._full 이름과 기타 속성이 드라이브 문자를 루트 경로로 보고한다는 것뿐입니다.
잘 작동하는 것 같습니다.
$location = \\path\to\long\
$driveLetter = ls function:[d-z]: -n | ?{ !(test-path $_) } | random
subst $driveLetter $location
sleep 1
Push-Location $driveLetter -ErrorAction SilentlyContinue
Get-ChildItem -Recurse
subst $driveLetter /D
이 명령은 분명히 파일을 삭제하는 것이 아니라 대체할 수 있습니다.
PowerShell을 AlphaFS.dll과 함께 사용하면 너무 긴 경로 없이 실제 파일 I/O 작업을 쉽게 수행할 수 있습니다.
예를 들어,
Import-Module <path-to-AlphaFS.dll>
[Alphaleonis.Win32.Filesystem.Directory]::Delete($path, $True)
이것에 대해서는 Codeplex: https://alphafs.codeplex.com/ 에서 확인하시기 바랍니다.NET 프로젝트.
원격 컴퓨터에서 폴더를 삭제하는 동안 동일한 문제가 발생했습니다.
아무것도 도움이 되지 않았지만...나는 한가지 속임수를 발견했습니다.
# 1:let's create an empty folder
md ".\Empty" -erroraction silentlycontinue
# 2: let's MIR to the folder to delete : this will empty the folder completely.
robocopy ".\Empty" $foldertodelete /MIR /LOG+:$logname
# 3: let's delete the empty folder now:
remove-item $foldertodelete -force
# 4: we can delete now the empty folder
remove-item ".\Empty" -force
로컬 또는 원격 폴더에서 매력처럼 작동(UNC 경로 사용)
Daniel Lee의 솔루션에 $myDir의 중간에 공백이 있으면 공간에서 분할된 파일 집합을 고려하여 FILE NOT FOUND 오류가 발생합니다.이를 극복하기 위해 변수 주위에 인용문을 사용하고 인용문을 생략하기 위해 파워셸 탈출 문자를 삽입합니다.
PS>cmd.exe /C "rmdir /s /q <grave-accent>"$myDir<grave-accent>""
대신 적절한 그레이브 액센트 문자를 대체하십시오.<grave-accent>
SO는 저와 함께 놀고 추가할 수 없습니다 :).다른 사람들이 쉽게 이해할 수 있도록 업데이트 해주길 바랍니다.
단지 완성도를 위해 몇 번 더 이 사실을 알게 되었고 다양한 상황에서 '서브스티드'와 'New-PSDrive'의 조합을 사용했습니다.
정확한 해결책은 아니지만 대안을 찾고 있는 사람이 있다면 이 방법이 도움이 될 것입니다.
Subst는 파일에 액세스하기 위해 사용하는 프로그램 유형에 매우 민감한 것으로 보이며 때로는 작동하고 때로는 작동하지 않는 것으로 나타나 New-PSDrive와 동일한 것으로 보입니다.
을 사용하여 개발된 모든 것.NET Out of Box는 경로가 너무 길어 실패합니다.8.3 이름, PINVoke(Win32) 호출 또는 로보카피 사용으로 이동해야 합니다.
언급URL : https://stackoverflow.com/questions/16392765/delete-directory-regardless-of-260-char-limit
'IT' 카테고리의 다른 글
MySQL - 표의 id 필드에 상대가 없는 숫자 목록에서 선택 (0) | 2023.10.20 |
---|---|
Docker Composition Wordpress with pure-ftpd - FTP 사용자에게 쓰기 권한이 없습니다. (0) | 2023.10.20 |
워드프레스:"wp_query" 클래스로 "post_content" 게시물을 검색하는 방법은 무엇입니까? (0) | 2023.10.20 |
AngularJs 블러에서 입력을 다시 렌더링하도록 강제하는 방법 (0) | 2023.10.20 |
MySql이 mysql 서버를 다시 시작한 후 사용자 암호를 재설정합니다. (0) | 2023.10.20 |