powershell - simbolico - mklink/h
Crear enlaces duros y blandos con PowerShell (11)
Combiné dos respuestas (@bviktor y @jocassid). Fue probado en Windows 10 y 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"""
}
}
¿Puede PowerShell 1.0 crear enlaces duros y blandos análogos a la variedad Unix?
Si esto no está incorporado, ¿alguien me puede señalar a un sitio que tiene un script ps1 que imita esto?
Esta es una función necesaria de cualquier buen caparazón, en mi humilde opinión. :)
En Windows 7, el comando es
fsutil hardlink create new-file existing-file
PowerShell lo encuentra sin la ruta completa (c: / Windows / system32) o la extensión (.exe).
En realidad, el comando de junction
Sysinternals solo funciona con directorios (no me preguntes por qué), por lo que no puede enlazar archivos. Me gustaría ir con cmd /c mklink
para enlaces suaves (no puedo entender por qué no es compatible directamente con PowerShell) o fsutil
para fsutil
.
Si necesita que funcione en Windows XP, no conozco otra cosa que el junction
Sysinternals, por lo que podría estar limitado a directorios.
Encontré esto de la manera más simple sin ayuda externa. Sí, usa un comando arcaico DOS pero funciona, es fácil y está claro.
$target = cmd /c dir /a:l | ? { $_ -match "mySymLink /[.*/]$" } | % `
{
$_.Split([char[]] @( ''['', '']'' ), [StringSplitOptions]::RemoveEmptyEntries)[1]
}
Utiliza el comando dir de DOS para buscar todas las entradas con el atributo de enlace simbólico, filtra el nombre específico del enlace seguido de los corchetes "[]" de destino, y para cada uno -presumiblemente uno- extrae solo la cadena objetivo.
Escribí un módulo de PowerShell que tiene envoltorios nativos para MKLINK. https://gist.github.com/2891103
Incluye funciones para:
- New-Symlink
- New-HardLink
- New-Junction
Captura la salida de MKLINK y arroja los errores de PowerShell adecuados cuando es necesario.
La utilidad de línea de comandos Junction de Sysinternals facilita la creación y eliminación de enlaces simbólicos (software). Enlaces y uniones duros en Windows.
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"
No, no está integrado en PowerShell y la utilidad mklink
en Windows Vista / Windows 7 está integrada directamente en cmd.exe
. Puede usar las extensiones de comunidad de PowerShell (gratis). Hay varios cmdlets para puntos de análisis de varios tipos:
-
New-HardLink
, -
New-SymLink
, -
New-Junction
, -
Remove-ReparsePoint
- y otros.
Puede llamar al mklink
proporcionado por cmd
, desde PowerShell para hacer enlaces simbólicos:
cmd /c mklink c:/path/to/symlink c:/target/file
Debe pasar /d
a mklink
si el objetivo es un directorio.
Para enlaces duros, sugiero algo como Sysinternals Junction .
Puedes usar esta utilidad:
c:/Windows/system32/fsutil.exe create hardlink
Windows 10 (y Powershell 5.0 en general) le permite crear enlaces simbólicos a través del cmdlet New-Item .
Uso:
New-Item -Path C:/LinkDir -ItemType SymbolicLink -Value F:/RealDir
O en tu perfil:
function make-link ($target, $link) {
New-Item -Path $link -ItemType SymbolicLink -Value $target
}
Active el Modo de desarrollador para no requerir privilegios de administrador al crear enlaces con New-Item
: