PowerShell을 사용하여 하드 링크와 소프트 링크 만들기


226

PowerShell 1.0에서 Unix와 유사한 하드 및 소프트 링크를 만들 수 있습니까?

이것이 내장되어 있지 않으면 누군가 이것을 모방하는 ps1 스크립트가있는 사이트를 가리킬 수 있습니까?

이것은 훌륭한 쉘 IMHO의 필수 기능입니다. :)


6
Windows 10 사용자는 stackoverflow.com/a/34905638/195755를 참조하십시오 . Windows 10 은 내장되어 있습니다. 복사 / 붙여 넣기 : New-Item -Type 및 Tab 키를 눌러 옵션 사이를 이동하십시오. Hardlink, SymbolicLink등을 Junction나를 위해 나타납니다. Windows Management Framework 5.0 이상을 통해 Powershell 5.0 이상이 설치된 Win 10, Server 2016 이상 또는 이전 OS에서 작동합니다.
— yzorg

2
New-Item -Type HardLinknor에 대한 알맞은 MSDN / TechNet 설명서를 찾을 수 없습니다 New-Item -Type SymbolicLink. New-Item docs link to help about_Providers(링크되지 않은) 각 공급자에 대한 도움말을 읽는 것이 좋습니다. 그러나 당신이 구글이라면 주위에 PowerShell 커뮤니티에 많은 버즈가 있습니다 New-Item -Type HardLink. PowerShell 엔지니어링 팀이 문서 팀을 방해하는 공급자 확장 점을 생각해 냈습니다 .
— yzorg

답변:


253

PowerShell에서 mklink제공 한을 호출하여 cmd기호 링크를 만들 수 있습니다.

cmd /c mklink c:\path\to\symlink c:\target\file

당신은 통과해야 /d에 mklink대상이 디렉토리 인 경우.

cmd /c mklink /d c:\path\to\symlink c:\target\directory

하드 링크의 경우 Sysinternals Junction 과 같은 것을 제안합니다 .


29
파워 쉘 프로파일이있는 경우 빠른 기능을 수행 할 수도 있습니다function mklink { cmd /c mklink $args }
— Joe Young

14
디렉토리 링크를 만들려면 명령은 {cmd / c mklink / D "toDir"fromDir}과 같습니다.
— DavidDraughn

9
mklink에 / H 매개 변수를 추가하면 Sysinternals Junction과 같은 타사 프로그램이 없어도 하드 링크가 생성됩니다.
— Fopedush

3
나는 jocassid가 더 나은 대답을 가지고 있다고 생각합니다. IMHO, 우리는 cmd.exe를 통한 익스플로잇과 핵을 사용하지 말고 PowerShell 사용법을 가르쳐야합니다.
— Cameron Oakenleaf


266

Windows 10 (및 일반적으로 Powershell 5.0)을 사용하면 New-Item cmdlet을 통해 심볼릭 링크를 만들 수 있습니다 .

용법:

New-Item -Path C:\LinkDir -ItemType SymbolicLink -Value F:\RealDir

또는 프로필에서 :

function make-link ($target, $link) {
    New-Item -Path $link -ItemType SymbolicLink -Value $target
}

다음 과 링크 할 때 관리자 권한을 요구하지 않도록 개발자 모드 를 켜십시오 New-Item.

여기에 이미지 설명을 입력하십시오


2
이 링크는 이제 MS 재 배열 설명서로 인해 끊어졌습니다. technet.microsoft.com/en-us/library/hh849795.aspx
— Aaron Thomas

3
New-Item-경로 C : \ LinkDir -ItemType SymbolicLink -Value F : \ RealDir
— Daniel Fisher lennybacon

7
Windows v1703부터 mklink를 사용하면 설정에서 개발자 모드가 활성화되어 있으면 New-Item이 활성화되지 않은 경우 계정 상승없이 심볼릭 링크를 만들 수 있습니다. 잘하면 다음 업데이트에서.
— papo 2016 년

매혹적인. 따라서 이것은 탐색기 .lnk단축키 와는 상당히 다릅니다 . 탐색기에서 같은 이름의 바로 가기 및 심볼릭 링크가 아무 것도없는 것처럼 나란히 표시됩니다. 그들의 행동은 미묘하게 다릅니다. 심볼릭 링크 다음에는 탐색기 표시 줄의 절대 경로가 표시됩니다. 바로 가기를 따르면 symlink parent dir이 실제 부모 인 것처럼 처리합니다.
— BaseZen

1
으로 허용 대답 , 나는의 경우 아니었다 상대 경로, 사용할 수 있었다 New-Item커맨드를.
— Dave F

41

"pscx"모듈 추가

아니요, PowerShell에 기본 제공되지 않습니다. 또한 mklink유틸리티 는 "내부 명령"으로 직접 내장되어 cmd.exe있으므로 Windows Vista / Windows 7에서 자체적으로 호출 할 수 없습니다 .

PowerShell 커뮤니티 확장 (무료)을 사용할 수 있습니다 . 다양한 유형의 재분석 지점에 대한 몇 가지 cmdlet이 있습니다.

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • 다른 사람.

1
잘 해봐 x32 또는 x64에서 XP 또는 W2K3 서버를 실행하려는 경우 New-Symlink가 작동하지 않습니다. XP에서는이 명령에 대해 Vista를 실행해야한다고 정중하게 알려줍니다. W2K3 서버에서는 중단이 발생합니다.
— Mike T

XP가 심볼릭 링크를 지원하지 않기 때문입니다. 이것은 Vista의 새로운 기능입니다. W2K3 서버는 심볼릭 링크를 지원하지 않는다고 생각합니다. symlink 지원을 받으려면 W2K8 서버까지 올라 가야합니다. W2k3에서 new-symlink가 폭격하는 이유를 살펴 보겠습니다. XP와 비슷한 메시지로 오류가 발생합니다.
— Keith Hill

나는 새로운 접합을 시도했고 그것이 나를 위해 일할 것입니다. 링크 기능이 XP 및 W2K3의 접합부로 저하되지 않는 것이 너무 나쁩니다.
— Mike T

new-junction의 추가 사용에 대해 ... 새로운 구문 분석 지점에 대한 junction을 얻습니다. 그러나 ls (또는 get-childitem) 오류는 .. "파일 이름, 디렉토리 이름 또는 볼륨 레이블 구문이 올바르지 않습니다."라는 오류 메시지가 표시됩니다.
— Mike T

2
Windows 10 사용자는 stackoverflow.com/a/34905638/195755 답변을 참조하십시오 . Windows 10 은 내장되어 있습니다. 복사 / 붙여 넣기 : New-Item -Type 및 Tab 키를 눌러 옵션 사이를 이동하십시오. Hardlink, SymbolicLink등을 Junction나를 위해 나타납니다. Windows Management Framework 5.0 이상을 통해 Powershell 5.0이 설치된 Win 10, Server 2016 이상 또는 이전 OS에서 작동합니다.
— yzorg

23

Windows 7에서 명령은

fsutil hardlink create new-file existing-file

PowerShell은 전체 경로 (c : \ Windows \ system32) 또는 확장명 (.exe)없이 파일을 찾습니다.


1
fsutil hardlink필요 new-file와 existing-file동일한 드라이브에있을 수 있습니다. 그게 중요하다면 mklink /c대신 cmd를 사용하십시오.
— 청소

9
@mopsled 하드 링크는 정의에 따라 대상과 동일한 볼륨에 있어야합니다. 이는 fsutilWindows 에만 해당되는 제한이 아닙니다.
— Dev

"소프트"심볼릭 링크 및 정션에 해당하는 것이 있습니까?
— jshall

Windows10 시스템에서도 작동했습니다.
— FooF

15

새로운 심볼릭 링크 :

Function New-SymLink ($link, $target)
{
    if (test-path -pathtype container $target)
    {
        $command = "cmd /c mklink /d"
    }
    else
    {
        $command = "cmd /c mklink"
    }

    invoke-expression "$command $link $target"
}

심볼릭 링크 제거 :

Function Remove-SymLink ($link)
{
    if (test-path -pathtype container $link)
    {
        $command = "cmd /c rmdir"
    }
    else
    {
        $command = "cmd /c del"
    }

    invoke-expression "$command $link"
}

용법:

New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"

2
Windows 10 사용자는 stackoverflow.com/a/34905638/195755를 참조하십시오 . Windows 10 은 내장되어 있습니다. 복사 / 붙여 넣기 : New-Item -Type 및 Tab 키를 눌러 옵션 사이를 이동하십시오. Hardlink, SymbolicLink등을 Junction나를 위해 나타납니다. Windows Management Framework 5.0 이상을 통해 Powershell 5.0이 설치된 Win 10, Server 2016 이상 또는 이전 OS에서 작동합니다.
— yzorg

또는 파일 이름에 포함되어있는 경우.
— Chris Charabaruk

10

junction.exe를 사용해보십시오

정션SysInternals 명령 행 유틸리티를 사용하면 junction을 쉽게 작성하고 삭제할 수 있습니다.

추가 자료

  • MS 용어 : soft! = 기호
    Microsoft는 "소프트 링크" 를 "junction"의 다른 이름으로 사용합니다 .
    그러나 "기호 링크" 는 완전히 다른 것입니다.
    MSDN : Windows의 하드 링크 및 접합 을 참조하십시오 .
    "이것은 "소프트 링크 " 와 "기호 링크 " ( "symlink " ) 가 동일한 것을 의미 하는 용어의 일반적인 사용법과는 모순됩니다 .)

이 유틸리티를 올바르게 사용하면 다른 디렉토리를 연결하고 하위 디렉토리를 성공적으로 탐색 할 수 있습니다. XP와 W2K3 모두 PATH의 디렉토리에 exe를 추가하고 정상적으로 호출하십시오.
— Mike T

junction.exe를 사용하여 기호 링크를 만들 수 있다고 생각하지 않습니다.
— Jason R. Coombs

3
mklinkWindows와 함께 제공되는 것을 사용 하는 것이 좋습니다 . 경우 당신이 함께 제공되는 Windows 버전이있다.
— 삭제

5

이 유틸리티를 사용할 수 있습니다 :

c:\Windows\system32\fsutil.exe create hardlink

1
그러나 높은 권한이 필요합니다. 하드 링크 생성은 일반적으로 그렇지 않습니다.
— Joey

3

MKLINK 용 기본 래퍼가있는 PowerShell 모듈을 작성했습니다. https://gist.github.com/2891103

다음을위한 기능을 포함합니다 :

  • 새로운 심볼릭 링크
  • New-HardLink
  • 새로운 정션

MKLINK 출력을 캡처하고 필요한 경우 적절한 PowerShell 오류를 발생시킵니다.


3

두 가지 답변 (@bviktor 및 @jocassid)을 결합했습니다. Windows 10 및 Windows Server 2012에서 테스트되었습니다.

function New-SymLink ($link, $target)
{
    if ($PSVersionTable.PSVersion.Major -ge 5)
    {
        New-Item -Path $link -ItemType SymbolicLink -Value $target
    }
    else
    {
        $command = "cmd /c mklink /d"
        invoke-expression "$command ""$link"" ""$target"""
    }
}

1

실제로 Sysinternals junction 명령은 디렉토리에서만 작동하므로 (이유를 묻지 않음) 파일을 하드 링크 할 수 없습니다. 나는 갈 것이다 cmd /c mklink(이 PowerShell을 직접 지원하지 왜 내가 알아낼 수 없습니다) 소프트 링크, 또는fsutil 하드 링크에 대해.

Windows XP에서 작동 해야하는 경우 Sysinternals 이외의 다른 것을 모르므 junction로 디렉토리로 제한 될 수 있습니다.


-1

외부 도움없이 간단한 방법을 찾았습니다. 예, 구식 DOS 명령을 사용하지만 작동하기 쉽고 쉽습니다.

$target = cmd /c dir /a:l | ? { $_ -match "mySymLink \[.*\]$" } | % `
{
    $_.Split([char[]] @( '[', ']' ), [StringSplitOptions]::RemoveEmptyEntries)[1]
}

이것은 DOS dir 명령을 사용하여 기호 링크 속성이있는 모든 항목을 찾고 특정 링크 이름에 대한 필터와 그 뒤에 대상 "[]"괄호를 붙이고 각각에 대해 대상 문자열 만 추출합니다.


5
다른 질문에 대한 답변입니까?
— Allanrbo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.