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

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

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-fileexisting-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.