CMD

リダイレクトの失敗検知

CMD

出力リダイレクトの「> XXX」で、XXX がディレクトリだったり、リードオンリーファイルだったりするとリダイレクトが失敗する。また、入力リダイレクト「ディレクトリだったり、存在しないとリダイレクトが失敗する。 ただし、これらの場合も、ERRORLEVEL は…

ATコマンドからの実行環境

CMD

at コマンドを使ってコマンドを実行したときは、特別な環境で実行されるようだ。先日書いた、GnuWin32のidコマンドを実行させてみると、 uid=0(SYSTEM) gid=0と表示される。もちろん、コマンドプロンプトから実行すると、上記のSYSTEMの部分にはユーザー名が…

for /L の謎

CMD

さて、久しぶりの謎シリーズ(?)。 echo off しない状態で、以下のバッチを実行すると、 for %%A in (1,2,3) do echo %%A&if %%A==2 goto :eof 当然ながら、 C:\WINDOWS\TEMP>for %A in (1 2 3) do echo %A & if %A == 2 goto :eof C:\WINDOWS\TEMP>echo 1 & …

パイプ前段のERRORLEVEL

CMD

ちょっとよくわからないこと。 setlocal enabledelayedexpansion set A=123 echo !A! → 当然 123 と表示 (echo !A!) → これも 123 と表示 echo !A! | more → これも 123 と表示 (echo !A!) | more → なぜか !A! と表示 パイプの要素でカッコで囲んだ場合だけ…

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

CMD

数ヶ月ぶりの続きであるが、まだまだ終わらない。「続」が6つなので7回目ということだ。ネットワーク上のファイル・ディレクトリに対して、if exist での判断が出来ないということで終わっていたが、何とかなりそうである。 Local DiskUNC nameNetwork Drive…

コマンドプロンプト機能Wikiの公開

CMD

NewsHandlerから記事を移し終わった。 まだまだ作成途上だが、「コマンドプロンプト機能Wiki」を公開します。 http://otnx.jp/CMD/TIPSだけにするか、スクリプトの公開までするかは未定。

(echo)の空白付加の謎

CMD

echo ABC (ABCの後に空白は入れない)とやると、ABCとCRLFの5バイトが出力される。echo ABC>abc.txt とやると同じく5バイトがファイル abc.txt に入る。 (echo ABC) や (echo ABC)>abc.txtとカッコで囲んでも同じだ。しかし、(echo ABC)| とパイプで次のプロ…

遅延環境変数のechoの謎

CMD

環境変数を echoするとき、値が空かも知れないときに、「ECHO は です。」等と表示されないために、echo. 等とするのは基本的なTIPSである。私はピリオドを好んで使っていたが、他の記号を好む人もいるようだ。今まで特に問題は無かったが、遅延環境変数で、…

CD コマンドの機能拡張 第二版

CMD

CDコマンドの拡張について二回書いたが([1]、[2])、仕様を一部変更追加削除して、ネットワークパスにも対応した。 移動はすべて pushd で行う。 cd のみのときはディレクトリスタックの表示 ホーム(%HOME%)への移動は cd ~ cd - で前のディレクトリに戻る cd…

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

CMD

半年ぶりの続きである。なかなか奥が深い。約1年前に、このような表を作った。 if exist FILE真if exist DIR真if exist NONE偽 if exist FILE\偽if exist DIR\真if exist NONE\偽 if exist FILE\.真if exist DIR\.真if exist NONE\.偽 if exist FILE\\偽if e…

CDコマンドの機能拡張〜ショートカット対応

CMD

少し前に、cd コマンドの拡張を行った。ちょっと思いついてショートカットにも対応してみた(多分)。.lnk ファイルの内容をきちんと解析しているわけじゃないので駄目なケースもあるのかもしれないが今のところ動いている。 面倒なのでショートカット先はCド…

WSHスクリプトのBATスクリプトへの組み込み(後編)

CMD

前回の続き。 VBScrirpt と異なり、JScript には、行末までのコメント記号 // の他に、 /* */ で囲んだ複数行コメントが書ける。従って、バッチスクリプト部分をこれで囲めばコンパイル対象外に出来るため VBScript のようなコンパイルエラーを回避できる。 …

WSHスクリプトのBATスクリプトへの組み込み(中編)

CMD

前回の続き。まず直感的に考え付くのが、中間ファイル版のパイプ化である。今回は、一週間後の日付けを表示するという具体例でいく。もちろんこの例のように表示だけなら VBScript だけでやればいいのだが、本来はバッチスクリプト部分でバッチスクリプトの…

複数行のnet sendメッセージ

CMD

以前書いた、環境変数に改行文字をセットの話だが、今一ついい使い道が思い浮かばなかった。今回、net send での複数行メッセージ送出に使うことを思いついた。 @echo off setlocal enabledelayedexpansion set DEST=%2 if not defined DEST set DEST=%COMPU…

WSHスクリプトのBATスクリプトへの組み込み(前編)

CMD

バッチスクリプトの中で、どうしてもバッチスクリプトの機能で実現できない部分だけを他のプログラムで補わないといけないことがある。既存プログラムなら、for /f の機能で処理結果を標準出力から受け取ればいいのだが、1コマンドで書けないスクリプトの場…

CMD.EXE だけで翌日の日付けを求める

CMD

前回、前日日付けを求めるスクリプトを書いたので、今回は翌日版。2月の処理がちょっと複雑になってしまった。 @echo off REM 日付の翌日を求める。結果は ANS にセット。 REM 引数(YYYYMMDD or YYYY-MM-DD or YYYY/MM/DD)がないときは本日とする。 if "%1"=…

CMD.EXE だけで昨日の日付けを求める

CMD

質問掲示板を見ていると良く見かける質問で、今日の日付けをファイル名につける等の日付け関係のものがある。今日の日付けだと、date/t や %DATE% を加工するだけなので簡単。たまに、昨日の日付けを求めると言うのがある。簡単に行うのは、VBScriptやJavaSc…

CD コマンドの機能拡張

CMD

このところBATスクリプトの話が途絶えてたので、自作スクリプトの紹介。cd コマンドの pushd 化と csh 風拡張。移動はすべて pushd で行う。 cd のみのときはディレクトリスタックの表示 ホーム(%HOME%)への移動は cd ~ cd - で前のディレクトリに戻る cd 存…

Win2000のFOR文のバグ

CMD

とある掲示板で回答して(今頃)気づいたのだが、Win2000の for /f %A in ('command ....') do の日本語処理にはバグがある。(XPでは直っている) for /f %%A in ('echo あいう123456789') do echo %%A for /f %%A in ('echo あ123456789') do echo %%A では、…

%~sIのバグについて

CMD

先日予告した通り、news:alt.msdos.batch.nt で発見した ~s 修飾子のバグについて。for変数や、バッチ引数には、%~sI や %~s1 という修飾子でショートネーム(または8.3形式。以下ではSFNと書く)形式のパス名・ファイル名を得ることが出来る。しかしこれには…

【続】日付け時刻を得る

CMD

先日、日付け時刻について、 まあ、date と書いた。 news:alt.msdos.batch.nt とかを最近読み書きしだしたのだが、そこに年月日の順序に依存しない日付け取得スクリプトが載っていた。ただし、date 構文解析めいたことをしない巧妙なやり方でそんなに複雑で…

日付時刻を得る

CMD

日付や時刻の入ったファイル名・フォルダ名を作るために、日付・時刻を BAT スクリプトで得たいという話が良くある。掲示板では、 for /f "tokens=1-3 delims=/ " %%A in ('date/t') do set YMD=%%A%%B%%C と答えたりするわけだが、これはWin2000やWinXPでも…

パラメータ区切り文字の謎

CMD

ビルトインコマンドの多く( echo は違うようだが)で、パラメータの区切りに、空白の他、, ; = が使える。コマンド処理の時点で空白になっているようだ。 例えば、 dir a.txt;b.txt,c.txt も可能だし、 for=%I=in=(A;B=C),do=@echo %I では、A B C が1行ずつ…

【続々々々】ディレクトリかどうかの判断〜whichコマンドの改訂版

CMD

以前の記事において、 昨日の記事に対し、 私は、dir "対象" /a:d してみて errorlevel を見ます。 NUL に頼るより確実では? というコメントを頂いた。ただ、if existで一気にチェックできるコンパクトさは捨てがたい。ということで、もう少しあがいてみま…

【続々々】tailコマンドの作成

CMD

続き。tail コマンドの完成版。+ オプションもつけたが、単に more の機能を使っているだけ。 @echo off setlocal set MORE= if not defined LINE set LINE=20 set "OPT=%~1" if not defined OPT goto pipe if "%OPT:~0,1%"=="/" echo>&2 コマンドの構文が誤…

call命令のオーバーヘッド〜添え字付き環境変数へのセット

CMD

前回書いた環境変数へセットする方式の tail コマンドでは、添え字付き環境変数へのセットで、call 命令を使う。前回書いたような eval 的な call の使い方と、実際にサブルーチンコールする場合とでの処理時間を念のため計ってみた。 for /l %%I in (1,1,10…

【続々】tailコマンドの作成

CMD

前回書いた2つの方法で書いた tail コマンドの基幹部分を示す。 (1) 中間ファイル方式 set I=-%LINE% set J=0 for /f "delims=" %%A in ('more %1') do ( set /a J+=1, I+=1 echo.%%A>%TEMPFILE% call set /p SAVE%%J%%=< %TEMPFILE% call set "SAVE%%I%%=" …

for制御変数から添え字付き環境変数へのセット

CMD

for制御変数から添え字付き環境変数へのセットの話の続き。もちろん、任意の内容を安全にセット出来なれればならない。set の = の左辺のみ2度評価して、右辺は1度しか評価してはいけないわけだが、1文でやるのは前回無理とわかった(実は書いた以上にもいろ…

【続】call 命令の謎

CMD

for /f 版の tail を作るに当たっての難関は、遅延展開を使わないで、添え字付き環境変数へのセットだ。unix で 配列変数機能の無い古い sh では、eval SAVE$J=\$VALUE とやるのが定石だ。これを参考に、左辺は call set SAVE%%J%%= と call を使う方法が思…

【続】tailコマンドの作成

CMD

昨日の head コマンドだが、第一パラメータで、+10 とか /E 等の more の有効なオプションを指定してしまうと、第二パラメータにファイル名を指定しても無視され標準入力待ちになってしまう。とりあえず、 set "OPT=%~1" if "%OPT:~0,1%"=="/" echo>&2 コマ…