はじめに
PowerShellでのシンボリックリンクの作り方を毎回調べているのでメモとして残す事にしました。
改めて見ると大したことないですが。
環境
> $PSVersionTable
Name Value
---- -----
PSVersion 7.3.6
PSEdition Core
GitCommitId 7.3.6
OS Microsoft Windows 10.0.22621
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
コマンドレット
New-Item -ItemType SymbolicLink -Path $path -Value $target
New-Item -ItemType SymbolicLink -Path $path -Name $name -Value $target
New-Item -ItemType SymbolicLink -Path $path -Target $target
New-Item -ItemType SymbolicLink -Path $path -Name $name -Target $target
解説
実体のある$target
のシンボリックリンクを$path
に作る。
New-Item -ItemType SymbolicLink -Path $path -Value $target
-Value
パラメータは、エイリアスとして-Target
を持っているので以下のようにも書ける。
New-Item -ItemType SymbolicLink -Path $path -Target $target
ディレクトリと名前を別々に指定したい場合は、以下のようにも出来る。
New-Item -ItemType SymbolicLink -Path $path -Name $name -Value $target
実行
シンボリックリンクを作るには管理者権限が必要。
例えば以下のような関数で監理者権限を調べられる。
function isAdmin {
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
return $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
そして以下のようにすると、監理者権限が無いとエラーメッセージが表示されるように出来る。
makeSymlink.ps1
param(
[Parameter(Mandatory = $true)][string]$target,
[Parameter(Mandatory = $true)][string]$path,
[Parameter()][string]$name
)
function isAdmin {
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
return $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
function makeSymLink {
param(
[Parameter(Mandatory = $true)][string]$target,
[Parameter(Mandatory = $true)][string]$path,
[Parameter()][string]$name
)
$value = isAdmin
if (!$value) {
Write-Host "管理者権限が必要"
return
}
if ($name -eq "") {
New-Item -ItemType SymbolicLink -Path $path -Value $target
}
else {
New-Item -ItemType SymbolicLink -Path $path -Name $name -Value $target
}
}
makeSymLink -target $target -path $path -name $name
これだとわざわざ管理者権限を取ってから実行しないといけないので面倒。
そこで、スクリプトファイルを管理者権限で実行するスクリプトを用意すると便利。
例えば以下のようになる。
callAsAdmin.ps1
param(
[Parameter(Mandatory = $true)][string]$script,
[Parameter()][string]$args
)
Start-Process pwsh -ArgumentList "-NoExit", $script, $args -Verb RunAs -Wait
これを実行するには以下のようにする。
> callAsAdmin.ps1 makeSymlink.ps1 "-target test.txt -path test1.link"
> callAsAdmin.ps1 makeSymlink.ps1 "-target test.txt -path . -name test1.link"