0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsの`sudo`でPowerShellの`New-Item`が「コマンドが見つかりません」になる理由と対処法

0
Posted at

はじめに

私は普段、プロンプトをいい感じにする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.exegit.exeのような実行ファイルではありません。

そのため、

sudo New-Item ...

では、sudoは実行すべきプログラムを見つけられず、

コマンドが見つかりません

となります。

例えば、diskpartのように管理者権限が必要なコマンドを実行する場合は、通常、管理者権限でPowerShellを起動し、その中でコマンドを実行します。

このとき、管理者権限を持っているのはPowerShellのプロセスです。そして、そのPowerShellから起動されたdiskpartなどのプロセスは、その管理者権限を引き継いで実行されます。

New-Itemも同様で、PowerShellのコマンドレットであるため、管理者権限を持つPowerShellのコンテキスト内で実行されます。一方、Windowsのsudoは実行ファイルを起動する仕組みであり、New-ItemのようなPowerShellコマンドレットを直接実行することはできません。そのため、New-Itemを実行するには、sudopwsh(またはpowershell)を起動し、その中でコマンドレットを実行する必要があります。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?