web-dev-qa-db-ja.com

PowerShellを使用してハードリンクとソフトリンクを作成する

PowerShell 1.0は、Unixに類似したハードリンクとソフトリンクを作成できますか?

これが組み込まれていない場合、誰かがこれを模倣するps1スクリプトを持っているサイトに私を指すことができますか?

これは、優れたシェル、IMHOに必要な機能です。 :)

201
Mike T

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 のようなものをお勧めします。

234
Jason R. Coombs

Windows 10(および一般的にPowershell 5.0)では、次のことができます New-Itemコマンドレットを使用してシンボリックリンクを作成

使用法:

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でリンクを作成するときに管理者権限が不要になります。

enter image description here

219
jocassid

いいえ、PowerShellには組み込まれていません。WindowsVista/Windows 7のユーティリティmklinkcmd.exeに直接組み込まれています。 PowerShell Community Extensions (無料)を使用できます。さまざまなタイプの再解析ポイント用のコマンドレットがいくつかあります。

  • New-HardLink
  • New-SymLink
  • New-Junction
  • Remove-ReparsePoint
  • その他。
39
Keith Hill

Windows 7では、コマンドは

fsutil hardlink create new-file existing-file

PowerShellは、フルパス(c:\ Windows\system32)または拡張子(.exe)なしで検索します。

23
quigi

新しいシンボリックリンク:

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

使用法:

New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"
15
bviktor

Sysinternalsの Junction コマンドラインユーティリティを使用すると、シンボリック(ソフト)リンクを簡単に作成および削除できます。 ハードリンクとジャンクション Windowsの場合。

10
notandy

このユーティリティを使用できます:

c:\Windows\system32\fsutil.exe create hardlink
5
Cheeso

MKLINKのネイティブラッパーを持つPowerShellモジュールを作成しました。 https://Gist.github.com/28911

次の機能が含まれます。

  • 新しいシンボリックリンク
  • New-HardLink
  • ニュージャンクション

MKLINK出力をキャプチャし、必要に応じて適切なPowerShellエラーをスローします。

3
joshuapoehls

2つの回答(@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"""
    }
}
3
mhenry1384

実際、 Sysinternalsjunctionコマンドはディレクトリでのみ機能するので(理由を聞かないでください)、ファイルをハードリンクできません。ソフトリンクの場合はcmd /c mklink(PowerShellで直接サポートされていない理由はわかりません)、ハードリンクの場合はfsutilを使用します。

Windows XPで動作する必要がある場合、Sysinternals junction以外は知らないので、ディレクトリに制限される可能性があります。

1
anon

私はこれを外部からの助けなしに簡単な方法で見つけました。はい、それは古風なDOSコマンドを使用しますが、動作し、簡単で、明確です。

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

これは、DOS dirコマンドを使用して、シンボリックリンク属性を持つすべてのエントリを検索し、特定のリンク名に続いてターゲット「[]」ブラケットをフィルター処理し、それぞれ-おそらく1つ-ターゲット文字列のみを抽出します。

0
Steven