3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[PowerShell] シンボリックリンクを作るメモ

Posted at

はじめに

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"
3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?