PowerShellを使用したハードリンクとソフトリンクの作成


226

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

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

これは、良いシェルであるIMHOに必要な機能です。:)


6
Windows 10ユーザーには、stackoverflow.com / a / 34905638/195755が表示されます。Windows 10 組み込みです。コピー/貼り付け:New-Item -Type タブを押してオプションを切り替えます。 HardlinkSymbolicLink、そしてJunction私のために表示されます。Windows Management Framework 5.0+を介してインストールされたPowershell 5.0+を備えたWorks Win 10、Server 2016+、または古いOS。
yzorg 2016

2
まともなMSDN / TechNetのドキュメントが見つからNew-Item -Type HardLinkないNew-Item -Type SymbolicLink。New-Item docsはにリンクしhelp about_Providersています。リンクされていない各プロバイダーのヘルプを読むことをお勧めします。しかし、グーグルの場合、PowerShellコミュニティにはたくさんの話題がありNew-Item -Type HardLinkます。PowerShellエンジニアリングチームが、ドキュメントチームを混乱させるプロバイダー拡張ポイントを考え出したようです。
yzorg 2016

回答:


253

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


29
powershellプロファイルがある場合は、クイック機能を作成することもできますfunction mklink { cmd /c mklink $args }
Joe Young

14
ディレクトリリンクを作成する場合、コマンドは{cmd / c mklink / D "toDir" fromDir}のようになります
DavidDraughn

9
/ Hパラメータをmklinkに追加すると、Sysinternals Junctionのようなサードパーティプログラムを必要とせずにハードリンクが作成されます。
Fopedush

3
jocassidがより良い答えを持っていると思います。私見、cmd.exeを介してエクスプロイトやハッキングを使用するのではなく、PowerShellの使用方法を教えるように努めるべきです。
Cameron Oakenleaf 2017


266

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

ここに画像の説明を入力してください


2
このリンクは、MSのドキュメントの再配置が原因で壊れています。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
Windows v1703以降、mklinkではアカウントの昇格なしでシンボリックリンクを作成できます。[設定]で開発者モードが有効になっている場合、New-Itemではできません。うまくいけば、次のアップデートで。
papo 2017年

魅力的です。したがって、これはエクスプローラの.lnkショートカットとはかなり異なります。エクスプローラーでは、同じ名前のショートカットとシンボリックリンクが、何も問題がないかのように並んで表示されます。彼らの行動は微妙に異なります。シンボリックリンクをたどると、エクスプローラバーに絶対パスが表示されます。ショートカットをたどると、シンボリックリンクの親ディレクトリが真の親であるかのように扱われます。
BaseZen

1
受け入れられた回答により、相対パスを使用することができましたが、New-Itemコマンドレットの場合はそうではありませんでした。
Dave F

41

「pscx」モジュールを追加

いいえ、PowerShellに組み込まれていません。また、このmklinkユーティリティは、「内部コマンド」として直接組み込まcmd.exeれているため、Windows Vista / Windows 7では単独で呼び出すことはできません。

PowerShell Community Extensions(無料)を使用できます。さまざまなタイプの再解析ポイント用のいくつかのコマンドレットがあります。

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

1
がんばったね。XPまたはW2K3サーバーをx32またはx64のいずれかで実行する場合、New-Symlinkは機能しません。XPでは、このコマンドでVistaを実行する必要があることを丁寧に伝えます。W2K3サーバーでは、ブレイクアウトがフラットになります。
マイクT

これは、XPがシンボリックリンクをサポートしていないためです。これはVistaの新機能です。W2K3サーバーもシンボリックリンクをサポートしていないと思います。シンボリックリンクをサポートするには、W2K8サーバーにステップアップする必要があります。new-symlinkがW2k3を爆破する理由を調べます。XPと同様のメッセージでエラーになるはずです。
キース・ヒル

私は新しいジャンクションを試してみましたが、それでうまくいきます。XPとW2K3のジャンクションへのリンク機能の劣化が悪すぎる
マイクT

new-junctionをさらに使用すると...新しい解析ポイントへのジャンクションができます。ただし、それを示すls(またはget-childitem)エラー..「ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません」そこからサブディレクトリを入力しようとすると、
マイクT

2
Windows 10ユーザーには、回答stackoverflow.com/a/34905638/195755が表示されます。Windows 10 組み込みです。コピー/貼り付け:New-Item -Type タブを押してオプションを切り替えます。 HardlinkSymbolicLink、そしてJunction私のために表示されます。Windows Management Framework 5.0+を介してPowershell 5.0がインストールされた、Win 10、Server 2016+、またはそれ以前のOSに対応
yzorg 2016

23

Windows 7では、コマンドは

fsutil hardlink create new-file existing-file

PowerShellは、完全パス(c:\ Windows \ system32)または拡張子(.exe)なしでそれを見つけます。


1
fsutil hardlink同じドライブ上にある必要がnew-fileありexisting-fileます。それが重要な場合は、mklink /c代わりにcmdを使用してください。
2015年

9
@mopsledハードリンクは、定義により、ターゲットと同じボリューム上にある必要があります。これは、fsutil(またはその問題に関してはWindows)固有の制限ではありません
Dev

「ソフト」シンボリックリンクとジャンクションに相当するものはありますか?
jshall

Windows10システムでも動作しました。
FooF 2019

15

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

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

削除シンボリックリンク:

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"

2
Windows 10ユーザーには、stackoverflow.com / a / 34905638/195755が表示されます。Windows 10 組み込みです。コピー/貼り付け:New-Item -Type タブを押してオプションを切り替えます。 HardlinkSymbolicLink、そしてJunction私のために表示されます。Windows Management Framework 5.0+を介してPowershell 5.0がインストールされたWin 10、Server 2016+、またはそれ以前のOSで動作します。
yzorg 2016

または、ファイル名にそれらが含まれている場合。
Chris Charabaruk 2017

10

junction.exeを試す

SysInternals のジャンクションコマンドラインユーティリティを使用すると、ジャンクションを簡単に作成および削除できます。

参考文献

  • MSの用語:ソフト!=シンボリック
    Microsoftは、「ジャンクション」の別名として「ソフトリンク」を使用しています。 ただし、「シンボリックリンク」はまったく別のものです。 MSDN:Windowsのハードリンクとジャンクションを参照してください。 (これは、「ソフトリンク」「シンボリックリンク」「シンボリックリンク」が同じことを意味するこれらの用語の一般的な使用法に直接矛盾します。)



このユーティリティを使用すると、別のディレクトリに接続して、そのサブディレクトリを正常にトラバースできます。XPとW2K3のすべて。exeをPATHのディレクトリに追加し、通常のように呼び出します。
マイクT

junction.exeを使用してシンボリックリンクを作成することはできないと思います。
Jason R. Coombs

3
mklinkWindowsに付属しているものを使用することをお勧めします。場合、あなたはそれが同梱されているWindowsのバージョンを持っています。
削除

5

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

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

1
ただし、昇格された特権が必要です。通常、ハードリンクを作成しません。
ジョーイ

3

MKLINKのネイティブラッパーを含むPowerShellモジュールを作成しました。https://gist.github.com/2891103

以下の機能が含まれます:

  • 新しいシンボリックリンク
  • 新しいハードリンク
  • 新しいジャンクション

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


3

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

1

実際、Sysinternals junctionコマンドはディレクトリでしか機能しないため(理由は聞かないでください)、ファイルをハードリンクできません。私は行くだろうcmd /c mklinkソフトリンク(それはPowerShellので直接サポートいない理由を私は理解できない)ため、またはfsutilハードリンクのために。

Windows XPで動作させるために必要な場合、私はSysinternals以外は何も知りませんjunction。そのため、ディレクトリに限定される可能性があります。


-1

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

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

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


5
これは別の質問に対する答えですか?
Allanrbo 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.