Criando links físicos e virtuais usando o PowerShell

226

O PowerShell 1.0 pode criar links físicos e físicos análogos à variedade Unix?

Se isso não estiver embutido, alguém pode me indicar um site que possua um script ps1 que imite isso?

Esta é uma função necessária de qualquer bom shell, IMHO. :)

Mike T
fonte
6
Os usuários do Windows 10 vêem stackoverflow.com/a/34905638/195755 . Windows 10 está embutido. Copiar / colar: New-Item -Type e pressione tab para percorrer as opções. Hardlink, SymbolicLinkE Junctionaparecer para mim. Funciona com sistema operacional Win 10, Server 2016+ ou anterior, com o Powershell 5.0+ instalado via Windows Management Framework 5.0+.
yzorg 28/09
2
Não consigo encontrar documentação decente do MSDN / TechNet para New-Item -Type HardLinknem New-Item -Type SymbolicLink. Os documentos de novos itens vinculam a help about_Providers, sugere que você leia a ajuda de cada provedor (que não está vinculado). Mas se você pesquisar no Google, há bastante burburinho na comunidade do PowerShell New-Item -Type HardLink. Parece que a equipe de engenharia do PowerShell criou pontos de extensão de provedor que atrapalham a equipe de documentos.
yzorg 28/09

Respostas:

253

Você pode chamar o mklinkfornecido por cmd, do PowerShell para criar links simbólicos:

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

Você deve passar /dpara mklinkse o destino for um diretório.

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

Para links físicos, sugiro algo como Sysinternals Junction .

Jason R. Coombs
fonte
29
Se você tem um perfil PowerShell, você também pode fazer uma função rápidafunction mklink { cmd /c mklink $args }
Joe Young
14
e se você deseja criar um link de diretório, o comando será algo como {cmd / c mklink / D "toDir" deDir} #
45460 DavidDraughn
9
adicionar o parâmetro / H ao mklink criará um link físico sem a necessidade de um programa de terceiros como o Sysinternals Junction.
Fopedush
3
Eu acho que o jocassid tem a melhor resposta. IMHO, devemos tentar ensinar como USAR o PowerShell, não usar explorações e hacks através do cmd.exe.
Cameron Oakenleaf
2
@SergeVoloshenko Com certeza . É verdade que usar New-Item detectará se o destino é um diretório , mas New-Item falhará se o destino não existir, enquanto o mklink criará o link simbólico independentemente .
Jason R. Coombs
266

O Windows 10 (e o Powershell 5.0 em geral) permite criar links simbólicos por meio do cmdlet New-Item .

Uso:

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

Ou no seu perfil:

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

Ative o Modo de desenvolvedor para não exigir privilégios de administrador ao criar links com New-Item:

insira a descrição da imagem aqui

jocassid
fonte
2
Este link agora está quebrado devido à documentação de reorganização da Microsoft. Eu encontrei um link de trabalho atual em technet.microsoft.com/en-us/library/hh849795.aspx
Aaron Thomas
3
New-Item -Path C: \ LinkDir -ItemType SymbolicLink -Value F: \ RealDir
Daniel Fisher lennybacon
7
desde o Windows v1703, o mklink permite criar links simbólicos sem elevação da conta; se o modo Desenvolvedor estiver ativado em Configurações, o item novo não. Espero que na próxima atualização.
papo 29/06
Fascinante. Portanto, isso é bastante distinto de um .lnkatalho do Explorer . No explorer, um atalho e link simbólico do mesmo nome são exibidos lado a lado como se nada estivesse errado. Seus comportamentos são sutilmente diferentes; seguindo o link simbólico mostra o caminho absoluto na barra do Explorer. Após o atalho, trata-o como se o diretório principal do link simbólico fosse o verdadeiro pai.
BaseZen 18/10/19
1
Com a resposta aceita , pude usar caminhos relativos, o que não era o caso do New-Itemcomando.
Dave F
41

Adicione o módulo "pscx"

Não, ele não está incorporado no PowerShell. E o mklinkutilitário não pode ser chamado por si só no Windows Vista / Windows 7, porque ele é incorporado diretamente cmd.execomo um "comando interno" .

Você pode usar as extensões da comunidade do PowerShell (grátis). Existem vários cmdlets para pontos de nova análise de vários tipos:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • e outros.
Keith Hill
fonte
1
Boa tentativa. Embora se você deseja executar o servidor XP ou W2K3 em x32 ou x64, o New-Symlink não funciona. No XP, ele educadamente dirá que você deve executar o Vista para este comando. No servidor W2K3, ele se destaca.
Mike T
Isso ocorre porque o XP não suporta links simbólicos. Esse é um recurso novo no Vista. Acredito que o servidor W2K3 também não oferece suporte a links simbólicos. Você precisa avançar para o servidor W2K8 para obter suporte ao link simbólico. Examinarei por que o novo link simbólico está bombardeando o W2k3; ele deve aparecer com uma mensagem semelhante ao XP.
211 Keith Hill
Eu tentei nova junção e isso funcionará para mim. Pena que a funcionalidade de ligação não se degrada para junções em XP e W2K3
Mike T
no uso adicional de new-junction ... eu recebo uma junção para o novo ponto de análise. No entanto, os erros ls (ou get-childitem) informam que .. "O nome do arquivo, o nome do diretório ou a sintaxe do rótulo do volume está incorreta" Se eu tentar inserir um subdiretório a partir daí.
Mike T
2
Os usuários do Windows 10 vêem a resposta stackoverflow.com/a/34905638/195755 . Windows 10 está embutido. Copiar / colar: New-Item -Type e pressione tab para percorrer as opções. Hardlink, SymbolicLinkE Junctionaparecer para mim. Funciona com sistema operacional Win 10, Server 2016+ ou anterior, com o Powershell 5.0 instalado via Windows Management Framework 5.0+.
yzorg 28/09
23

No Windows 7, o comando é

fsutil hardlink create new-file existing-file

O PowerShell o encontra sem o caminho completo (c: \ Windows \ system32) ou a extensão (.exe).

quigi
fonte
1
fsutil hardlinkrequer new-filee existing-fileestar na mesma unidade. Se isso for importante para você, use os cmd's mklink /c.
varrido
9
@mopsled hardlinks, por definição, deve ser no mesmo volume como o alvo, isto não é uma limitação específica para a fsutil(ou o Windows para esse efeito)
Dev
existe um equivalente para links simbólicos "suaves" e junções?
jshall
Trabalhou também em um sistema Windows10.
FooF 21/02/19
15

Novo link simbólico:

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"
}

Remove-Symlink:

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

    invoke-expression "$command $link"
}

Uso:

New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"
bviktor
fonte
2
Os usuários do Windows 10 vêem stackoverflow.com/a/34905638/195755 . Windows 10 está embutido. Copiar / colar: New-Item -Type e pressione tab para percorrer as opções. Hardlink, SymbolicLinkE Junctionaparecer para mim. Funciona com sistema operacional Win 10, Server 2016+ ou anterior, com o Powershell 5.0 instalado via Windows Management Framework 5.0+.
yzorg 28/09
Ou se o nome do arquivo os contiver.
precisa saber é o seguinte
10

Tente junction.exe

O utilitário de linha de comando Junction da SysInternals facilita a criação e a exclusão de junções.

Leitura adicional

  • Terminologia da Microsoft: soft! = Simbólico A
    Microsoft usa "soft link" como outro nome para "junção" .
    No entanto: um "link simbólico" é algo totalmente diferente.
    Consulte MSDN: Links físicos e junções no Windows.
    (Isso está em contradição direta com o uso geral dos termos em que "link virtual" e "link simbólico" ( "link simbólico" ) significam a mesma coisa .)
notandy
fonte
O uso desse utilitário corretamente permite que eu junte outro diretório e atravesse seus subdiretórios com êxito. Tudo no XP e W2K3. Basta adicionar o exe a um diretório no seu PATH e chamá-lo normalmente.
Mike T
Eu não acho que você pode usar junction.exe para criar links simbólicos.
Jason R. Coombs
3
É melhor usar o mklinkque é fornecido com o Windows. Se você possui uma versão do Windows com a qual ela é fornecida.
Excluído
5

Você pode usar este utilitário:

c:\Windows\system32\fsutil.exe create hardlink
Cheeso
fonte
1
Isso exigirá privilégios elevados, no entanto. Criando hardlinks geralmente não.
214 Joey
3

Eu escrevi um módulo do PowerShell que possui invólucros nativos para o MKLINK. https://gist.github.com/2891103

Inclui funções para:

  • Novo link simbólico
  • New-HardLink
  • New-Junction

Captura a saída MKLINK e gera erros adequados do PowerShell quando necessário.

joshuapoehls
fonte
3

Combinei duas respostas (@bviktor e @jocassid). Foi testado no Windows 10 e 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"""
    }
}
mhenry1384
fonte
1

Na verdade, o comando Sysinternals junction funciona apenas com diretórios (não me pergunte por que), portanto, não pode vincular arquivos. Eu usaria cmd /c mklinklinks flexíveis (não consigo entender por que ele não é suportado diretamente pelo PowerShell) ou fsutilpara hardlinks.

Se você precisar que ele funcione no Windows XP, não conheço outra coisa senão a Sysinternals junction; portanto, você pode estar limitado a diretórios.

anon
fonte
-1

Achei isso da maneira mais simples, sem ajuda externa. Sim, ele usa um comando arcaico do DOS, mas funciona, é fácil e é claro.

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

Isso usa o comando dir do DOS para encontrar todas as entradas com o atributo de link simbólico, filtros no nome do link específico seguido pelos colchetes de destino "[]" e para cada um - presumivelmente um - extrai apenas a string de destino.

Steven
fonte
5
Esta é uma resposta para uma pergunta diferente?
Allanrbo