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. :)

Foi útil?

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:

 enter descrição da imagem aqui

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top