PowerShell 1.0は、Unixの種類に類似したハードリンクとソフトリンクを作成できますか?
これが組み込まれていない場合、誰かがこれを模倣するps1スクリプトがあるサイトを教えてもらえますか?
これは、優れたシェルであるIMHOに必要な機能です。:)
PowerShell 1.0は、Unixの種類に類似したハードリンクとソフトリンクを作成できますか?
これが組み込まれていない場合、誰かがこれを模倣するps1スクリプトがあるサイトを教えてもらえますか?
これは、優れたシェルであるIMHOに必要な機能です。:)
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から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
ハードリンクについては、SysinternalsJunctionのようなものをお勧めします。
いいえ、PowerShellには組み込まれていません。また、ユーティリティは「内部コマンド」として直接組み込まれmklink
ているため、Windows Vista /Windows7では単独で呼び出すことはできません。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"
}
削除-シンボリックリンク:
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コマンドラインユーティリティを使用すると、ジャンクションの作成と削除が簡単になります。
このユーティリティを使用できます。
c:\Windows\system32\fsutil.exe create hardlink
2つの答え(@bviktorと@jocassid)を組み合わせました。Windows10およびWindowsServer2012でテストされました。
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"""
}
}
MKLINKのネイティブラッパーを持つPowerShellモジュールを作成しました。https://gist.github.com/2891103
次の機能が含まれています。
MKLINK出力をキャプチャし、必要に応じて適切なPowerShellエラーをスローします。
実際、Sysinternals junction
コマンドはディレクトリでのみ機能するため(理由は聞かないでください)、ファイルをハードリンクすることはできません。ソフトリンク(PowerShellで直接サポートされていないcmd /c mklink
理由がわかりません)またはfsutil
ハードリンクを使用します。
Windows XPで動作するために必要な場合は、Sysinternals以外は何も知らないjunction
ので、ディレクトリに制限される可能性があります。
私はこれが外部の助けなしの簡単な方法だと思いました。はい、それは古風なDOSコマンドを使用しますが、それは機能し、簡単で、明確です。
$target = cmd /c dir /a:l | ? { $_ -match "mySymLink \[.*\]$" } | % `
{
$_.Split([char[]] @( '[', ']' ), [StringSplitOptions]::RemoveEmptyEntries)[1]
}
これは、DOS dirコマンドを使用して、シンボリックリンク属性を持つすべてのエントリを検索し、特定のリンク名の後にターゲット "[]"ブラケットを付けてフィルタリングし、それぞれ(おそらく1つ)に対してターゲット文字列のみを抽出します。