Criação de links duros e moles usando PowerShell
-
23-08-2019 - |
Pergunta
Can PowerShell 1.0 criar links duros e macios análogas à variedade Unix?
Se isto não for construída dentro, alguém pode me aponte para um site que tem um script ps1 que imita isso?
Esta é uma função necessária de qualquer bom shell, IMHO. :)
Solução
Você pode chamar o mklink
fornecido pelo cmd
, do PowerShell para fazer links simbólicos:
cmd /c mklink c:\path\to\symlink c:\target\file
Você deve passar /d
para mklink
se o destino for um diretório.
cmd /c mklink /d c:\path\to\symlink c:\target\directory
Para as ligações duras, eu sugiro algo como Sysinternals junção .
Outras dicas
Windows 10 (e PowerShell 5.0 em geral) permite-lhe criar links simbólicos através do New-item cmdlet .
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
}
Ligar desenvolvedor Modo para não exigir privilégios de administrador ao fazer ligações com New-Item
:
Não, não é construído em PowerShell eo mklink
utilitário no Windows Vista / Windows 7 é construído diretamente em cmd.exe
. Você pode usar o href="https://github.com/Pscx/Pscx" rel="noreferrer"> PowerShell Community Extensions
New-HardLink
, New-SymLink
, New-Junction
, Remove-ReparsePoint
No Windows 7, o comando é
fsutil hardlink create new-file existing-file
PowerShell encontra-lo sem o caminho completo. (C: \ Windows \ system32) ou extensão (.exe)
New-Symlink:
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"
O junção utilitário de linha de comando da Sysinternals torna a criação e exclusão de simbólica (soft) liga fácil. links físicos e junções no Windows.
Você pode usar esse utilitário:
c:\Windows\system32\fsutil.exe create hardlink
Eu escrevi um módulo PowerShell que tem wrappers nativas para MKLINK. https://gist.github.com/2891103
inclui funções para:
- New-Symlink
- New-hardlink
- New-Junção
Captura a saída MKLINK e gera erros PowerShell adequadas quando necessário.
Eu combinei duas respostas (@bviktor e @jocassid). Ele foi testado em 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"""
}
}
Na verdade, o comando Sysinternals junction
só funciona com diretórios (não me pergunte porquê ), por isso não pode arquivos hardlink. Eu iria com cmd /c mklink
para links moles (eu não posso figura porque não é suportado diretamente pelo PowerShell), ou fsutil
para hardlinks.
Se você precisar dele para trabalhar no Windows XP, eu não sei de outra coisa senão Sysinternals junction
, de modo que você pode ser limitado aos diretórios.
I este encontrou a maneira simples sem ajuda externa. Sim, ele usa um comando arcaica DOS mas funciona, é fácil, e é claro.
$target = cmd /c dir /a:l | ? { $_ -match "mySymLink \[.*\]$" } | % `
{
$_.Split([char[]] @( '[', ']' ), [StringSplitOptions]::RemoveEmptyEntries)[1]
}
Este usa o comando dir DOS para encontrar todas as entradas com o atributo link simbólico, filtros sobre o nome do link específico seguido por alvo "[]" suportes, e para cada um - presumivelmente um - extratos apenas a string alvo