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


はじめに

初投稿です

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

  • 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 easy "&" ""cd /d %CD%""'-verb runas
    exit /B
)
if "%1"=="su" (
    powershell  -NoProfile start-process cmd -ArgumentList '/k easy "&" ""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
)

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
)

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