4
4

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.

カレントディレクトリーで管理者コマンドプロンプトを開くsudoもどきを作った(引数付き)

Last updated at Posted at 2019-01-24

はじめに

初投稿です

こんなことを解決出来るように作りました

  • windowsでもsudoコマンドぽいの使いたい
  • カレントディレクトリーで開きたい(C:\Windows\System32で開きたくない)
  • 引数つけたい
  • GUIアプリケーションを起動した時にコマンドプロンプトを起動したくない
  • もっとLinuxぽく使いたい(sudo suとか打つと管理者コマンドプロンプトが起動する)

前提条件

  • PATHの通し方を知っている事
  • バッチファイルを作成出来る事

実行環境

Windows 10 OSビルド 17763.253 (PowerShellが入っていればどの端末でも動くと思われ)

作り方

以下のコマンドのバッチファイルを作成しPATHを通す

sudo.bat

@echo off
REM 管理者権限でコマンドプロンプトを開く
if "%1"=="cmd" (
	powershell  -NoProfile start-process cmd -ArgumentList '/k ""cd /d %CD%""'-verb runas
	exit /B
)
if "%1"=="su" (
	powershell  -NoProfile start-process cmd -ArgumentList '/k ""cd /d %CD%""'-verb runas
	exit /B
)
if "%~x1"==".exe" (
	powershell -NoProfile Start-Process %1 -ArgumentList '"%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9" ' -Verb Runas
	exit /B
)
REM コマンドはcmd.exeに流して実行
if not "%1"=="" (
	powershell -NoProfile Start-Process cmd -ArgumentList '/K ""cd /d %CD%"" "&" "%1" "%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9" ' -Verb Runas
) else (
    rem 引数がなければエラーを返す
	echo コマンド構文が間違っています 1>&2
	echo sudo [実行するコマンド][実行するコマンドにつける引数]	1>&2
	exit /B
)

sudo dirとか出来たら成功

構文

sudo [実行するコマンド][実行するコマンドにつける引数]

説明

  1. このPowerShellコマンドでコマンドプロンプトを管理者権限で実行
    powershell -NoProfile Start-Process cmd -Verb Runas
  2. -ArgumentListオプションでcmd.exeに追加する引数を追加
  3. &はコマンドプロンプトでコマンドを連続して実行する際に使う
  4. ""cd /d %CD%""でカレントディレクトリーで実行
  5. 引数は最大9個までつけられる "%1" "%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9"

$*がなぜか使えない…

もっとLinuxぽく使いたい

  • 引数にsucmdを入れたら管理者コマンドプロンプトが起動するようにしたい
  • if文で第一引数がsu or cmd の時に起動するようにする
  • sudo cmd sudo su とか出来るようになる
  • エラーを表示したい
  • 引数無しで呼び出された時にエラーを表示
  • 引数をつけるよう促す文を標準エラー出力に表示
    • 標準出力を標準エラー出力にリダイレクトし、表示する1>&2
sudo.bat
@echo off
rem 管理者権限でコマンドプロンプトを開く
if "%1"=="cmd" (
	powershell  -NoProfile start-process cmd -ArgumentList '/k ""cd /d %CD%""'-verb runas
	exit /B
)
if "%1"=="su" (
	powershell  -NoProfile start-process cmd -ArgumentList '/k ""cd /d %CD%""'-verb runas
	exit /B
)
rem コマンドはcmd.exeに流して実行
if not "%1"=="" (
	powershell -NoProfile Start-Process cmd -ArgumentList '/K ""cd /d %CD%"" "&" "%1" "%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9" ' -Verb Runas
) else (
    rem 引数がなければエラーを返す
	echo コマンド構文が間違っています  1>&2 
	echo sudo [実行するコマンド][実行するコマンドにつける引数]  1>&2
	exit /B
)

Windows Terminalにも対応させてみた

2022/2/26 追記

sudo.bat
REM 管理者権限でWindows Terminalを起動するコマンド
if "%1"=="wt" (
    powershell  -NoProfile Start-Process wt.exe -ArgumentList '"new-tab --startingDirectory" "%CD%"' -verb runas
    exit /B
)

GUIアプリケーションを起動した時にコマンドプロンプトを起動したくない

※firefoxにPATHが通っている事にして話しています
sudo firefoxと実行すると管理者コマンドプロンプトも起動してしまう。
引数に拡張子付き(.exe)で指定した場合、第一引数を直接管理者権限で実行するように変更
if文で.exeがついているか判定(%~x1で引数から拡張子だけを取得できる)
sudo firefox.exe

sudo.bat
if "%~x1"==".exe" (
	powershell -NoProfile Start-Process %1 -ArgumentList '"%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9" ' -Verb Runas
	exit /B
)

誰かもっといい方法ありませんか…

2022/2/26 追記
コメント欄にて @e4rfx 様に、引数を可変長にできる方法を教えて頂きました。

sudo.bat
if "%~x1"==".exe" (
    powershell -nop "start -v runas %*"
    exit /B
)
4
4
3

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
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?