はじめに
初投稿です
こんなことを解決出来るように作りました
- 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 [実行するコマンド][実行するコマンドにつける引数]
説明
- このPowerShellコマンドでコマンドプロンプトを管理者権限で実行
powershell -NoProfile Start-Process cmd -Verb Runas
-
-ArgumentList
オプションでcmd.exe
に追加する引数を追加 -
&
はコマンドプロンプトでコマンドを連続して実行する際に使う -
""cd /d %CD%""
でカレントディレクトリーで実行 - 引数は最大9個までつけられる
"%1" "%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9"
※$*
がなぜか使えない…
もっとLinuxぽく使いたい
- 引数に
su
とcmd
を入れたら管理者コマンドプロンプトが起動するようにしたい -
if
文で第一引数がsu
orcmd
の時に起動するようにする -
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
)