- 北の空からみなみへ -
exblog staff

<< cmd.exe 砂場遊び /3... 砂場遊び /3.4 (ちょこっ... >>
砂場遊び /ワンライナー番外地
2018年 03月 04日
エラーレベル(%errorlevel%)をセットするのに cmd/c exit <数字> とやると、任意の数のエラーレベルを戻り値として返すことができると気づいた。

そこで、パス文字列を 擬似配列変数に分解し、エラーレベルとしてパス文字のフォルダ数を返し、パスの擬似配列リストを標準出力するワンライナーを書いてみた。
(windows 10 と XP で動作確認)

キャレットエスケープ使いまくりなのが恥ずかしい。
cmd/q/v:on/k prompt ^^^> ^&path=%path%;^&path=!path:;;=;!^&for /L %i in (1001,1,1999) do set/a $i=%i^>nul^&set $i=!$i:~1!^&for /F "delims=;" %p in ("!PATH!") do set $PATH!$i!=%p^&set path=!PATH:%p;=!^&if not defined PATH set/a $c=%i-1000^>nul^&set $PATH^&exit !$c!
 ↑ これは1行なのでメモ帳的には下の感じ。
cmd/q/v:on/k prompt ^^^> ^&path=%path%;^&path=!path:;;=;!^&for /L %i in (1001,1,1023) do set/a $i=%i^>nul^&set $i=!$i:~1!^&for /F "delims=;" %p in ("!PATH!") do set $PATH!$i!=%p^&set path=!PATH:%p;=!^&if not defined PATH set/a $c=%i-1000^>nul^&set $PATH^&exit !$c!




へっぽこ解説かもです。

バッチ内で記述するならもっと行数使えるのですがね。。やっぱりワンライナーは最低の変更で気楽に使えるもの。
:PLAY$single.path.select
cmd/q/v:on/k prompt ^^^> ^&path=%path%;^&path=!path:;;=;!^&for /L %%i in (1001,1,1999) do set/a $i=%%i^>nul^&set $i=!$i:~1!^&for /F "delims=;" %%p in ("!PATH!") do set $PATH!$i!=%%p^&set path=!PATH:%%p;=!^&if not defined PATH set/a $c=%%i-1000^>^&2^&set $PATH^&exit !$c!
exit/b %errorlevel%

cmd.exe 起動時の /q オプションはエコーオフ状態で動作する目的(バッチ自体がエコーオフであっても子プロセスは独立した状態なので)
最初の prompt 設定は、記述が破綻してエラー終了した場合にバッチ内でエコーオンしたら、居場所がわかるように。
次の PATH文字列の末尾に「;」を加えたのは、マシンによって(Windows XPがそうだった)末尾がセミコロンで終わっていないケースがあるため。
(さらに直後で セミコロン二重打ちを修正している)
あとは、擬似連番を振るための for /L とその連番をゼロフィル(ゼロパディング)する処理が続き<、br>パス文字から delims=; で一つずつパス指定を切り出しして、最終的にパス文字が消えたところで終了コードを計算。
コマンドライン上では、set/a コマンドの計算結果(代入値)が表示されるので、それを >&2 で標準エラー出力に切り替え、con(コンソール)に表示。こうしてリダイレクトでファイルに落としても影響がないようにした。
(当然ながら親プロセス復帰時にはパス文字は回復している)

コマンドラインであればエラーコードがそのまま戻るが、バッチでは exit/b する行に %errorlevel% を置いて戻る必要があるため、2行となっている。

なお、この出力を(エコーオフ状態で)ファイルにリダイレクトして、そのファイルを for /F で読み出せば、擬似配列変数を親(つまり呼び出し側)プロセスに反映させることができる。

読み出す設定例はこんな感じ(だろうと思う)
for /F "delims=" %%f in ("リダイレクト出力されたファイル名") do set %%f
もしくは
for /F "delims=" %%f in ("リダイレクト出力されたファイル名") do call set %%f



一晩寝て気づいたのだが、コマンドラインコンソールの文字数制限ってあったような。。。
調べてみると 8191文字ってのが最大らしい。。。orz...

となると、バッチの方だけでも path=%path%; のあたりで一度区切らないと長いパスの環境だと厳しいのかもしれない。
(これだけならまあ、事前に path文字を規格化しちゃえばいいことなのだけど。)
遅延展開環境変数の場合には、%変数% 形式と違ってコマンドライン上では展開表示されていないから、本当にどれだけの文字長で制限に引っかかるのは実験してみないとわからなそうではある。(暇ないからやらないけれど = 他力本願モード)
[PR]
by bucmacoto | 2018-03-04 04:58 | &Tips;&code; | Trackback(7) | Comments(0)
トラックバックURL : https://bucmac.exblog.jp/tb/29348468
トラックバックする(会員専用) [ヘルプ]
Tracked from weight loss .. at 2018-08-17 21:53
タイトル : weight loss calculator
砂場遊び /ワンライナー番外地 : 北の夢想科学小説... more
Tracked from mac cleaner .. at 2018-08-18 01:26
タイトル : mac cleaner virus removal
砂場遊び /ワンライナー番外地 : 北の夢想科学小説... more
Tracked from mac cleaner .. at 2018-08-18 08:58
タイトル : mac cleanup utilities review
砂場遊び /ワンライナー番外地 : 北の夢想科学小説... more
Tracked from santa letter.. at 2018-08-18 08:58
タイトル : santa letter packages
砂場遊び /ワンライナー番外地 : 北の夢想科学小説... more
Tracked from mac cleaner .. at 2018-08-18 12:39
タイトル : mac dvd cleaner
砂場遊び /ワンライナー番外地 : 北の夢想科学小説... more
Tracked from mac cleaner .. at 2018-08-18 21:13
タイトル : installieren mac adware clea..
砂場遊び /ワンライナー番外地 : 北の夢想科学小説... more
Tracked from weight loss .. at 2018-08-19 03:05
タイトル : weight loss running app
砂場遊び /ワンライナー番外地 : 北の夢想科学小説... more
名前
URL
画像認証
削除用パスワード
<< cmd.exe 砂場遊び /3... 砂場遊び /3.4 (ちょこっ... >>
<< cmd.exe 砂場遊び /3... 砂場遊び /3.4 (ちょこっ... >>