CMD
5回目は、PATH環境変数のサーチ。基本的には前回と同じチェックを、PATHの内容を順次付加しながら行っていく。今回は最初にスクリプトを示す。 全体については2回目を参照。そこで書いた【パスのサーチ】というのが以下である。入力された文字列は、%%Xに入…
4回目は、PATH環境変数を使ったサーチの前にcmd.exeが行う実行ファイルチェックの部分について。 このケースには、 (1) コマンドとして入力された文字列がそのまま実行ファイル名である場合 (2) コマンドとして入力された文字列にPATHEXTの内容を付加したも…
3回目は、DOSKEYマクロのサーチである。関連したスクリプト部分を以下に示す。2回目も参照。 01 【前処理】 02 for %%X in (%*) do ( 03 for /f "delims=" %%A in ('DOSKEY /MACROS') do ( 04 for /f "delims==" %%B in ("%%A") do if /i "%%B" == "%%X" ech…
8/5記事においていったんギブアップした標準入力の読み取りではあるが、ちょっと思いついたので、WHICHコマンドの連載を中断してこっちを書く。set /pによる標準入力読み取りにおいて空行とEndOfFileが区別できないのは確かである。しかし、空行には次にいず…
昨日の1回目はDOSKEYの説明で疲れたので今日の、2回目は軽く、全体のメインループと、比較的簡単なビルトインコマンドサーチ部分を書く。【 】の部分は3回目以降の説明である。便宜上、行番号をつける。 01 @echo off 02 set _= 03 setlocal 04 set BLT=ASSO…
実験のネタが尽きてきたので、これから何回かに分けて自作のWHICH.BATというスクリプトの解説でもしようかと思います。 まずは、仕様から。 unixにwhichというコマンドがある。シェルがコマンドを実行する際にPATH環境変数をサーチするが、その実際に実行さ…
7/21標準入力からの読み取りにおいて、set /p コマンドによる標準入力からの読み取りをパイプから行った場合、タイミングが合わないので数行おきにしか読めないと書いた。これを確かめてみた。 1行出力ごとに1秒待つプログラムを作成した。(プログラムはフリ…
昨日の記事で、" " で囲むとおかしくなるケースで1つ思い出した。 ページブラウザというテキストビューアーがある。Win3.1のころからあるが、JIS/SJIS/EUCJPの3種の文字コードを認識・表示し、CR/NL/CRLFの3種の改行コードを自由に変換できる機能を持って…
if exist %A%\NUL を使ったディレクトリ判断について、 昨日、空白を含んでいるとだめだと書いたが、それは正しくないようだ。 if exist "C:\Program Files\NUL"偽 if exist C:\Program Files\NUL構文不正 if exist "C:\PROGRA~1\NUL"偽 if exist C:\PROGRA~…
変数Aに何らかのパス名が入っているとして、それがディレクトリかファイルかの判断には、 if exist %A%\NUL echo ディレクトリ を愛用していた。しかし、Aが空白を含んでいるときは、これが正しくない。%A%\NULが存在しないのだ。 バグではないか?(未調査)…
変数の遅延展開が、構文解析後に起こることを考えると、7/20メモの「変数中のリダイレクト文字」の振る舞いについても対処が出来そうである。 @echo off setlocal enabledelayedexpansion set /p A=A: echo (!A!) というスクリプトを作り、Aに色々な文字、 |…
昨日書いた for /f "delims=" %%A in ("%A%") do だが、環境変数Aに " が奇数個含まれるとおかしくなるので駄目。 for /f "delims=" %%A in ("aaa"bbb") do のようになって構文解析が失敗するため。遅延展開を使って、 for /f "delims=" %%A in ("!A!") do …
環境変数の値をそのままFOR制御変数にセットしたい場合、 for /f "delims=" %%A in ("%A%") do for /f "tokens=*" %%A in ("%A%") do 前者ではそのままセットされる。 後者では、先頭の空白が除去されてセットされる(途中や最後の空白は残る)。環境変数に比…
setlocalすると、スクリプト実行後の環境変数にセットするには、endlocalのあとでセットするしかない。 しかしセットしたい値はローカル変数に入っているので、endlocalの後では参照できない。 endlocalの後までローカル変数を持ち越す手段を講じる必要があ…
shift 命令を実行したら $* にも反映されてほしいが、しない。 バグ?
%PATH% を;で切り離してそれぞれの要素を別々に処理したいとき、 for %%I in (%PATH%) do echo %%I で、おおむね良いが、「Program Files」のように空白が入っているとそれが区切りになって うまく処理されない。PATHに追加するときに、「PROGRA~1」のよう…
set /p を使えば、sh の read 相当のことが出来るのではないかと思い、 @echo off setlocal :loop set /p X= if not %ERRORLEVEL% == 0 goto :eof echo "%X%" goto loop と書いてみる(zz.bat)。 set /p で ^Z を入れると ERRORLEVEL が 1 になることは別途確…
変数Aに「BBB > CCC」が入っていた場合、 echo %A% で、「BBB > CCC」が表示されると期待したが、 echo BBB > CCC とみなされる。つまり、CCCという名のファイルにBBBが書き込まれる。なお、変数Aへの「BBB > CCC」をセットしようと、 set A=BBB > CCC とす…