2003-01-01から1年間の記事一覧

お便りに応えて

CMD

コメント*1にはコメントでと思いましたが、本文のネタが無いので本文でお返事します。>バッチコマンドスクリプトで個人用ツールをちょくちょく組んでいるものです。長いものだと 2000行近くなることもあります。これには驚きました。BATにそのレベルのもの…

WHICHコマンド (6) 〜最後〜

CMD

最終回は残りの部分。1回目の仕様で書いた、 (5) PATHをサーチして見つけた最初の実行ファイルのフルパスを環境変数「 _ 」にセットする の部分であるが、最後なので全文を掲載する。例によってインデントは2バイト空白なのでコピーペーストする人は注意。PA…

WHICHコマンド (5) 〜コマンド探索(後編)〜

CMD

5回目は、PATH環境変数のサーチ。基本的には前回と同じチェックを、PATHの内容を順次付加しながら行っていく。今回は最初にスクリプトを示す。 全体については2回目を参照。そこで書いた【パスのサーチ】というのが以下である。入力された文字列は、%%Xに入…

WHICHコマンド (4) 〜コマンド探索(前編)〜

CMD

4回目は、PATH環境変数を使ったサーチの前にcmd.exeが行う実行ファイルチェックの部分について。 このケースには、 (1) コマンドとして入力された文字列がそのまま実行ファイル名である場合 (2) コマンドとして入力された文字列にPATHEXTの内容を付加したも…

WHICHコマンド (3) 〜DOSKEYマクロのサーチ〜

CMD

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…

【続々】標準入力からの読み取り

CMD

8/5記事においていったんギブアップした標準入力の読み取りではあるが、ちょっと思いついたので、WHICHコマンドの連載を中断してこっちを書く。set /pによる標準入力読み取りにおいて空行とEndOfFileが区別できないのは確かである。しかし、空行には次にいず…

WHICHコマンド (2) 〜メインループとビルトインコマンド〜

CMD

昨日の1回目はDOSKEYの説明で疲れたので今日の、2回目は軽く、全体のメインループと、比較的簡単なビルトインコマンドサーチ部分を書く。【 】の部分は3回目以降の説明である。便宜上、行番号をつける。 01 @echo off 02 set _= 03 setlocal 04 set BLT=ASSO…

WHICHコマンド (1) 〜仕様とDOSKEYマクロ〜

CMD

実験のネタが尽きてきたので、これから何回かに分けて自作のWHICH.BATというスクリプトの解説でもしようかと思います。 まずは、仕様から。 unixにwhichというコマンドがある。シェルがコマンドを実行する際にPATH環境変数をサーチするが、その実際に実行さ…

【続】標準入力からの読み取り

CMD

7/21標準入力からの読み取りにおいて、set /p コマンドによる標準入力からの読み取りをパイプから行った場合、タイミングが合わないので数行おきにしか読めないと書いた。これを確かめてみた。 1行出力ごとに1秒待つプログラムを作成した。(プログラムはフリ…

【外伝】ページブラウザ(PGBROW32.EXE)

CMD

昨日の記事で、" " で囲むとおかしくなるケースで1つ思い出した。 ページブラウザというテキストビューアーがある。Win3.1のころからあるが、JIS/SJIS/EUCJPの3種の文字コードを認識・表示し、CR/NL/CRLFの3種の改行コードを自由に変換できる機能を持って…

【続】ディレクトリかどうかの判断

CMD

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~…

ディレクトリかどうかの判断

CMD

変数Aに何らかのパス名が入っているとして、それがディレクトリかファイルかの判断には、 if exist %A%\NUL echo ディレクトリ を愛用していた。しかし、Aが空白を含んでいるときは、これが正しくない。%A%\NULが存在しないのだ。 バグではないか?(未調査)…

【続】変数中のリダイレクト文字

CMD

変数の遅延展開が、構文解析後に起こることを考えると、7/20メモの「変数中のリダイレクト文字」の振る舞いについても対処が出来そうである。 @echo off setlocal enabledelayedexpansion set /p A=A: echo (!A!) というスクリプトを作り、Aに色々な文字、 |…

【続】環境変数のFOR制御変数へのセット

CMD

昨日書いた for /f "delims=" %%A in ("%A%") do だが、環境変数Aに " が奇数個含まれるとおかしくなるので駄目。 for /f "delims=" %%A in ("aaa"bbb") do のようになって構文解析が失敗するため。遅延展開を使って、 for /f "delims=" %%A in ("!A!") do …

環境変数のFOR制御変数へのセット

CMD

環境変数の値をそのままFOR制御変数にセットしたい場合、 for /f "delims=" %%A in ("%A%") do for /f "tokens=*" %%A in ("%A%") do 前者ではそのままセットされる。 後者では、先頭の空白が除去されてセットされる(途中や最後の空白は残る)。環境変数に比…

setlocalしたスクリプトから外部の環境変数をセット

CMD

setlocalすると、スクリプト実行後の環境変数にセットするには、endlocalのあとでセットするしかない。 しかしセットしたい値はローカル変数に入っているので、endlocalの後では参照できない。 endlocalの後までローカル変数を持ち越す手段を講じる必要があ…

引数の shift

CMD

shift 命令を実行したら $* にも反映されてほしいが、しない。 バグ?

%PATH%の要素分解

CMD

%PATH% を;で切り離してそれぞれの要素を別々に処理したいとき、 for %%I in (%PATH%) do echo %%I で、おおむね良いが、「Program Files」のように空白が入っているとそれが区切りになって うまく処理されない。PATHに追加するときに、「PROGRA~1」のよう…

標準入力からの読み取り

CMD

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 になることは別途確…

変数中のリダイレクト文字

CMD

変数Aに「BBB > CCC」が入っていた場合、 echo %A% で、「BBB > CCC」が表示されると期待したが、 echo BBB > CCC とみなされる。つまり、CCCという名のファイルにBBBが書き込まれる。なお、変数Aへの「BBB > CCC」をセットしようと、 set A=BBB > CCC とす…

拡張子関連付けで起動時のリダイレクト

Win

\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer InheritConsoleHandles 新設DW =1 スクリプトを拡張子関連付けでコマンドラインから起動した時のSTDIN/STDOUTリダイレクトを可能にする。 W2KSP4、XPSP1以降で有効(Windo…

CDROM自動実行をすべてオフ

Win

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdrom AutoRun 変更DW 1->0 CDROMの自動実行をオフにする2003-08-24修正 http://www.mnet.ne.jp/~angie/kbase/xp-autorun.html によると、 それにこの設定をWindows XPで行うと,CD-ROMメディアの交換…

CMDrc

Win

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor AutoRun 設定SZ DOSKEY /MACROFILE=C:\usr\DOSKEY.INI コマンドプロンプト実行時にマクロ設定する。 (出典: CMD /?)

MSNの起動停止

Win

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run MSMSGS 削除SZ MSNetworkメッセンジャの起動を止める。 元の値は、"C:\Program Files\Messenger\msmsgs.exe" /background

ファイル検索のウィザードを止める

Win

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState Use Search Asst 新設SZ no WXPで、ファイル検索画面をW2Kと同じにする

キー割り当て変更

Win

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout Scancode Map 新設BIN 00,00,00,00,00,00,00,00,03,00,00,00,1d,00,3a,00,29,00,79,00,00,00,00,00 英数をコントロール、変換を半全に

カーネル常駐

Win

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management DisablePagingExecutive 変更DW 0->1 OSカーネルの実メモリ常駐

ファイルバッファ拡大

Win

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management IoPageLockLimit 変更DW 0->16777216 ファイルバッファを16MByteにする

エクスプローラを別プロセスで実行

Win

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer DesktopProcess 新設DW 1 エクスプローラを別プロセスで実行するように変更

その他ディスクモード関係

Win

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}\0002 ResetErrorCountersOnSuccess 新規DW 1エラーが発生してもディスクモードが変更されにくくする