programing

파일이 PowerShell의 심볼 링크인지 확인합니다.

oldcodes 2023. 8. 7. 23:06
반응형

파일이 PowerShell의 심볼 링크인지 확인합니다.

디렉터리 트리에 있는 PowerShell 스크립트를 사용하고 있으며, 가끔은 처리하면 안 되는 보조 파일이 하드 링크되어 있습니다.파일 여부를 쉽게 확인할 수 있는 방법이 있습니까?System.IO.FileInfo 아닌가요?)는 하드 링크입니까, 아닌가요?

그렇지 않다면 심볼릭 링크(심플링크)를 사용하는 것이 더 쉬울까요?

사용해 보십시오.

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

이것은 꽤 최소한의 구현이지만, 효과가 있을 것입니다.하드 링크와 심볼릭 링크는 구분되지 않습니다.기본적으로 둘 다 NTFS 재분석 지점인 IIRC활용합니다.

5의 한 링크, 및 합니다.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}

하드 링크에 대한 여러 대상이 필요한 경우 탭으로 구분된 대상을 나열하는 이 변형을 사용합니다.

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

스크립트를 하려면 관리자 할 수 .C:\.

용의 Where-ObjectRearsePoint 파일 특성을 검색합니다.

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

리소스가 하드 링크 또는 심볼 링크인지 확인하려는 사용자:

(Get-Item ".\some_resource").LinkType -eq "HardLink"

(Get-Item ".\some_resource").LinkType -eq "SymbolicLink"

키스 힐의 파워셸 스크립트를 사용하여 심볼릭 링크와 하드 링크를 테스트한 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

심볼릭 링크는 재분석 지점이며, 재분석 지점 File Attribute 비트가 설정되어 있지만 하드 링크는 설정되어 있지 않습니다.

여기 하나의 파일을 확인하는 하나의 라이너가 있습니다.$FilePath 및 합니다.

if((Get-ItemProperty $FilePath).LinkType){"symboliclink"}else{"normal path"}

저만의 2센트를 추가하고 싶습니다. 이것은 제게 완벽하게 잘 작동하는 하나의 라이너 함수입니다.

Function Test-Symlink($Path){
    ((Get-Item $Path).Attributes.ToString() -match "ReparsePoint")
}

다음 PowerShell 스크립트는 -recurse 스위치가 있는 디렉토리에 있는 모든 파일을 나열합니다.파일 이름, 일반 파일인지 하드 링크된 파일인지 여부 및 크기가 콜론으로 구분되어 나열됩니다.

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

Windows와 함께 제공된 fslink 유틸리티를 사용하고 하드링크 및 목록 스위치를 사용하여 각 파일에 대해 이 유틸리티를 실행하고 출력 라인을 카운트합니다.2개 이상일 경우 하드 링크된 파일입니다.

검색이 ▁the▁the▁changing▁starts▁you다▁the▁directory니▁of▁can있을 변경하여 변경할 수 있습니다.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

에 문제가 생겼습니다.대상이 null(OneDrive 파일)이고 SYMLINKD와 SYMLINK를 구별하고 싶어서 이 변형을 고안했습니다(HardLink를 처리하지 않음).제 목표는 다른 곳에서 재현할 수 있도록 그곳에 있는 것을 포착하는 것이었습니다.? = Where-Object 및 % = Forach-Object에 유의하십시오.

### ReparsePoint + Directory + Junction = mklink /j 
### ReparsePoint + Directory + SymbolicLink = mklink /d 
### ReparsePoint + SymbolicLink = mklink 

"cd $( $pwd.Path )"; Get-ChildItem | ? { $_.Attributes -match 'ReparsePoint' -and $_.Target -ne $null } | % {
    $linktype = $_.LinkType
    $target = Resolve-Path -Path $_.Target
    if ($_.Attributes -match 'Directory') {
        if ($linktype -eq "Junction") {
            "mklink /j `"$($_.Name)`" `"$target`""
        } else {
            "mklink /d `"$($_.Name)`" `"$target`""
        }
    } else {
        "mklink `"$($_.Name)`" `"$target`""
    }
}

언급URL : https://stackoverflow.com/questions/817794/find-out-whether-a-file-is-a-symbolic-link-in-powershell

반응형