PowerShell 1.0は、Unixに類似したハードリンクとソフトリンクを作成できますか?
これが組み込まれていない場合、誰かがこれを模倣するps1スクリプトを持っているサイトに私を指すことができますか?
これは、優れたシェル、IMHOに必要な機能です。 :)
PowerShellからmklink
が提供するcmd
を呼び出して、シンボリックリンクを作成できます。
cmd /c mklink c:\path\to\symlink c:\target\file
ターゲットがディレクトリの場合は、/d
をmklink
に渡す必要があります。
cmd /c mklink /d c:\path\to\symlink c:\target\directory
ハードリンクについては、 Sysinternals Junction のようなものをお勧めします。
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
でリンクを作成するときに管理者権限が不要になります。
いいえ、PowerShellには組み込まれていません。WindowsVista/Windows 7のユーティリティmklink
はcmd.exe
に直接組み込まれています。 PowerShell Community Extensions (無料)を使用できます。さまざまなタイプの再解析ポイント用のコマンドレットがいくつかあります。
New-HardLink
、New-SymLink
、New-Junction
、Remove-ReparsePoint
Windows 7では、コマンドは
fsutil hardlink create new-file existing-file
PowerShellは、フルパス(c:\ Windows\system32)または拡張子(.exe)なしで検索します。
新しいシンボリックリンク:
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"
Sysinternalsの Junction コマンドラインユーティリティを使用すると、シンボリック(ソフト)リンクを簡単に作成および削除できます。 ハードリンクとジャンクション Windowsの場合。
このユーティリティを使用できます:
c:\Windows\system32\fsutil.exe create hardlink
MKLINKのネイティブラッパーを持つPowerShellモジュールを作成しました。 https://Gist.github.com/28911
次の機能が含まれます。
MKLINK出力をキャプチャし、必要に応じて適切なPowerShellエラーをスローします。
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"""
}
}
実際、 Sysinternalsjunction
コマンドはディレクトリでのみ機能するので(理由を聞かないでください)、ファイルをハードリンクできません。ソフトリンクの場合はcmd /c mklink
(PowerShellで直接サポートされていない理由はわかりません)、ハードリンクの場合はfsutil
を使用します。
Windows XPで動作する必要がある場合、Sysinternals junction
以外は知らないので、ディレクトリに制限される可能性があります。
私はこれを外部からの助けなしに簡単な方法で見つけました。はい、それは古風なDOSコマンドを使用しますが、動作し、簡単で、明確です。
$target = cmd /c dir /a:l | ? { $_ -match "mySymLink \[.*\]$" } | % `
{
$_.Split([char[]] @( '[', ']' ), [StringSplitOptions]::RemoveEmptyEntries)[1]
}
これは、DOS dirコマンドを使用して、シンボリックリンク属性を持つすべてのエントリを検索し、特定のリンク名に続いてターゲット「[]」ブラケットをフィルター処理し、それぞれ-おそらく1つ-ターゲット文字列のみを抽出します。