雑に作ったPythonスクリプトを雑に使う - 再戦

TL;DR

  • 前のエントリでどう見てもスマートでない方法について書いたが、案の定もっといい方法があった。
  • 「もっといい方法」はバッチファイルで実現されると知り、今まで敬遠してたバッチについて勉強した。
  • バッチの力で件の問題にリベンジする。

本編

経緯

そもそも前のエントリで解決したいと言っていた問題を要約すると:

  • 以下のような真似ができるようになるdeploy.exeが欲しい!
適当に作ったスクリプトをdeployすると……
C:\some\dir> echo print("hoge") > hogehoge.py
C:\some\dir> deploy hogehoge.py

どこからでも拡張子なしで呼び出せる!
C:\some\dir> cd C:\another\dir
C:\another\dir> hogehoge
hoge 
  • なんでdeploy.exeが欲しいかというと、.batは呼ぶときに拡張子まで書かなくちゃいけなくて面倒だからだ!

……ということだったのですが、既にここに勘違いが1つありまして、

.batは呼ぶときに拡張子まで書かなくちゃいけなくて面倒

誤り でした。というのも、PATHEXT環境変数というのがあるそうで*1、ここに設定された拡張子は省略しても実行可能、しかも .batはデフォルトでここに含まれている というのです*2。し、知らなかった……。

僕が.batを使わなかった理由なんて

.batは呼ぶときに拡張子まで書かなくちゃいけなくて面倒

以外に何もないので、PATHEXTの存在を知った今、わざわざ.exeなんて錬成するなんて面倒なことをしたくはありません*3。今こそdeploy.batを作るときです!

ところが、今まで.batなんか使いたくないやいと思い続けてきたので、書き方が微塵もわからない。というわけで少し勉強しました。もう無敵です。首洗って待ってろよdeploy.bat

解決編

大見得を切りましたが、実はdeploy.batの書き方はコメントでほとんど教えてもらっていたりしました。その長さわずか2行。ほんまdeploy.exeなんだったんやアレ。

以下は、.py以外の拡張子に対応したり、スクリプトに引数を渡せるようにしたりしただけのやつです。前のやつ合計130行くらいあったけど、これ30行くらいですね。なんでも勉強しておくもんだなあ……。

どうやって読むかはバッチファイル勉強エントリでも参考にしてください。以上!

@echo off

if "%1" == "" (
  echo Usage: %0 ^<script-path^>
  exit /b 1
)

setlocal enabledelayedexpansion
  set batDir=batを置いておく場所
  set scrDir=スクリプトを置いておく場所
  
  set run[.exe]=call
  set run[.bat]=call
  set run[.py]=python
  set run[.exs]=elixir

  if not exist %~1 (
    echo File Not Found: %~1
    exit /b 1
  )

  if not defined run[%~x1] (
    echo Extension "%~x1" is not supported.
    exit /b 1
  )

  copy %~f1 %scrDir% > nul
  echo @!run[%~x1]! %scrDir%\%~nx1 %%* > %batDir%\%~n1.bat
endlocal

*1:コメントで教えていただきました……。

*2:更に言えば、PATHEXTに.pyなどを加えることもできるそうで、すると件の記事の解はズバリ「作ったスクリプトをパスの通ったとこにコピーしろ」ということになります。……とは言え安易に.pyをPATHEXTに加えようものなら、どこに落ちてるどんなスクリプトを誤って踏み抜くか分かったもんではないのでできれば避けたいわけで、本記事はPATHEXTを弄らない方針を取っています。

*3:そもそもそんなことするやつおる?????