はじめに
私は普段、プロンプトをいい感じにするstarshipの設定ファイルを.dotfilesで管理しているのですが、Windows上でシンボリックリンクを貼ろうとしたところ、次のようなエラーが発生しました。
sudo New-Item -ItemType SymbolicLink `
-Path "starship.toml" `
-Target "~/.dotfiles/starship/starship.toml"
すると、
コマンドが見つかりません
解決方法
PowerShellを起動し、その中でコマンドレットを実行すれば正常に動作します。
PowerShell 5の場合
sudo powershell -Command "New-Item -ItemType SymbolicLink -Path 'starship.toml' -Target '$HOME/.dotfiles/starship/starship.toml'"
PowerShell 7 (pwsh) の場合
sudo pwsh -Command "New-Item -ItemType SymbolicLink -Path 'starship.toml' -Target '$HOME/.dotfiles/starship/starship.toml'"
原因
結論から言うと、
WindowsのsudoはPowerShellのコマンドレットを直接実行できません。
New-ItemはPowerShellに組み込まれているコマンドレットであり、notepad.exeやgit.exeのような実行ファイルではありません。
そのため、
sudo New-Item ...
では、sudoは実行すべきプログラムを見つけられず、
コマンドが見つかりません
となります。
例えば、diskpartのように管理者権限が必要なコマンドを実行する場合は、通常、管理者権限でPowerShellを起動し、その中でコマンドを実行します。
このとき、管理者権限を持っているのはPowerShellのプロセスです。そして、そのPowerShellから起動されたdiskpartなどのプロセスは、その管理者権限を引き継いで実行されます。
New-Itemも同様で、PowerShellのコマンドレットであるため、管理者権限を持つPowerShellのコンテキスト内で実行されます。一方、Windowsのsudoは実行ファイルを起動する仕組みであり、New-ItemのようなPowerShellコマンドレットを直接実行することはできません。そのため、New-Itemを実行するには、sudoでpwsh(またはpowershell)を起動し、その中でコマンドレットを実行する必要があります。