문제

디렉토리 트리를 걷는 PowerShell 스크립트가 있으며 때로는 처리되지 말아야 할 보조 파일이 딱딱합니다. 파일을 찾는 쉬운 방법이 있습니까? System.IO.FileInfo) 하드 링크입니까?

그렇지 않다면 기호 링크 (Symlinks)를 사용하면 더 쉬울까요?

도움이 되었습니까?

해결책

이 시도:

function Test-ReparsePoint([string]$path) {
  $file = Get-Item $path -Force -ea SilentlyContinue
  return [bool]($file.Attributes -band [IO.FileAttributes]::ReparsePoint)
}

그것은 매우 최소한의 구현이지만 트릭을 수행해야합니다. 이것은 하드 링크와 상징적 링크를 구별하지 않습니다. 그 아래에서 그들은 둘 다 활용합니다 NTFS Reparse 포인트, IIRC.

다른 팁

PowerShell 5+가있는 경우 다음 1 라이너는 모든 파일 하드 링크, 디렉토리 접합 및 상징적 링크 및 그 대상을 재귀 적으로 나열합니다. d:\Temp\:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,Target

산출:

FullName                                LinkType     Target
--------                                --------     ------
D:\Temp\MyJunctionDir                   Junction     {D:\exp\junction_target_dir}
D:\Temp\MySymLinkDir                    SymbolicLink {D:\exp\symlink_target_dir}
D:\Temp\MyHardLinkFile.txt              HardLink     {D:\temp\MyHardLinkFile2.txt, D:\exp\hlink_target.xml}
D:\Temp\MyHardLinkFile2.txt             HardLink     {D:\temp\MyHardLinkFile.txt, D:\exp\hlink_target.xml}
D:\Temp\MySymLinkFile.txt               SymbolicLink {D:\exp\symlink_target.xml}
D:\Temp\MySymLinkDir\MySymLinkFile2.txt SymbolicLink {D:\temp\normal file.txt}

하드 링크의 여러 대상에 관심이있는 경우 TARBS-SEPARINED를 나열하는이 변형을 사용하십시오.

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,@{ Name = "Targets"; Expression={$_.Target -join "`t"} }

이 스크립트를 실행하려면 관리자 권한이 필요할 수 있습니다. C:\.

활용하십시오 Where-Object Reparsepoint 파일 속성을 검색합니다.

Get-ChildItem | Where-Object { $_.Attributes -match "ReparsePoint" }

Keith Hill의 PowerShell 스크립트를 사용하여 Symlinks 및 Hardlinks를 테스트하는 Vista의 결과 :

c:\markus\other>mklink symlink.doc \temp\2006rsltns.doc
symbolic link created for symlink.doc <<===>> \temp\2006rsltns.doc

c:\markus\other>fsutil hardlink create HARDLINK.doc  \temp\2006rsltns.doc
Hardlink created for c:\markus\other\HARDLINK.doc <<===>> c:\temp\2006rsltns.doc

c:\markus\other>dir
 Volume in drive C has no label.
 Volume Serial Number is C8BC-2EBD

 Directory of c:\markus\other

02/12/2010  05:21 PM    <DIR>          .
02/12/2010  05:21 PM    <DIR>          ..
01/10/2006  06:12 PM            25,088 HARDLINK.doc
02/12/2010  05:21 PM    <SYMLINK>      symlink.doc [\temp\2006rsltns.doc]
               2 File(s)         25,088 bytes
               2 Dir(s)   6,805,803,008 bytes free

c:\markus\other>powershell \script\IsSymLink.ps1 HARDLINK.doc
False

c:\\markus\other>powershell \script\IsSymLink.ps1 symlink.doc
True

Symlinks는 재판매 점이며, 하드 링크는 그렇지 않지만 Reparsepoint fileattribute 비트가 설정되어 있음을 보여줍니다.

다음 PowerShell 스크립트는 모든 파일을 디렉토리 또는 디렉토리 스위치와 함께 나열합니다. 파일 이름은 일반 파일이든 하드 링크 파일이든 크기를 콜론으로 분리합니다.

PowerShell 명령 줄에서 실행해야합니다. 스크립트에 설정된 디렉토리에서 실행하는 디렉토리는 중요하지 않습니다.

Windows와 함께 배송 된 FSLink 유틸리티를 사용하고 하드 링크 및 목록 스위치를 사용하여 각 파일에 대해 실행하고 출력 라인을 계산합니다. 둘 이상의 경우 딱딱한 파일입니다.

물론 검색이 시작하는 디렉토리를 변경하여 변경할 수 있습니다. c:\windows\system 명령에서. 또한 스크립트는 단순히 결과를 파일에 씁니다. c:\hardlinks.txt. 이름을 변경하거나> 문자에서 모든 것을 삭제하면 화면으로 출력됩니다.

Get-ChildItem -path C:\Windows\system -file -recurse -force | 
    foreach-object {
        if ((fsutil hardlink list $_.fullname).count -ge 2) {
            $_.PSChildname + ":Hardlinked:" + $_.Length
        } else {
            $_.PSChildname + ":RegularFile:" + $_.Length
        }
    } > c:\hardlinks.txt
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top