465) Len Marcel 2003/07/28(月) 11:38 |
|
単純な質問なのですが,お答え頂ければありがたいです。 ある変数の桁数を取得したいのですが,DOSの世界で,VBでいう ところのLen関数のようなものはあるのでしょうか? ネットで色々調べているのですが,それらしきものが以外と出て こないので,困っております。 どなたかご教授願います。 |
|
466) Re:Len ふぇむ 2003/07/28(月) 13:55 |
|
>ある変数の桁数を取得したいのですが,DOSの世界で,VBでいう >ところのLen関数のようなものはあるのでしょうか? 直接長さを得るLEN関数みたいなのはないと思います。 DOSバッチコマンドの範囲だけで解決するなら、その変数の内容を echo でファイルへリダイレクトしてそのサイズを見て、末尾の改行の2バイト分を差し引けば、変数の内容のバイト数が得られると思いますが、どうでしょう。(な お、この問題に限りませんが、変数の内容として含まれる可能性のある文字に、DOSバッチコマンドのコマンドライン上でなんかしら意味のあるような記号が 混じっているとうまくいきません) じっくり考えると、別の手段で、あっと驚くような裏ワザ的な解決手段があるかもしれませんが、もしできたとしても結構厄介でしょうね。 なお、DOSバッチコマンド以外も使えるなら、例えば awk とか、例えば WSH とか、を使えるならば、比較的簡単に解決すると思います。 |
|
467) Re2:Len Marcel 2003/07/28(月) 14:02 |
|
ふぇむさん,早速の回答ありがとうございます。 >DOSバッチコマンドの範囲だけで解決するなら、その変数の内容を echo でファイルへリダイレクトしてそのサイズを見て、末尾の改行の2バイト分を差し引けば、変数の内容のバイト数が得られると思いますが、どうでしょう。(な お、この問題に限りませんが、変数の内容として含まれる可能性のある文字に、DOSバッチコマンドのコマンドライン上でなんかしら意味のあるような記号が 混じっているとうまくいきません) なるほど,バイト数を比べるっていうのは思いつきませんでした。 早速試してみようと思います。どうもありがとうございました! >なお、DOSバッチコマンド以外も使えるなら、例えば awk とか、例えば WSH とか、を使えるならば、比較的簡単に解決すると思います。 WSHやVBSなどを使えばすぐに出来ることは分かっているのですが, 環境的にDOSのバッチプログラムしか使えない環境でして。。。 取り合えず、ご教授頂いた方法でやってみようと思います。 どうも、ありがとうございました。 |
|
469) Re3:Len ふぇむ 2003/07/28(月) 14:10 |
|
>早速試してみようと思います。どうもありがとうございました! おお、コメント早いですね~。 注意点を補足します。 echo %変数% > ファイル とした場合には2つめの % と > の間のスペースにも意味があるので、その分のカウントが必要です。これを嫌がって、 echo %変数%> ファイル とくっつけると、例えば変数の中身が 1234 2 とかの場合、評価すると echo 1234 2> ファイル となって「標準エラー出力のリダイレクト」になってしまうので注意が必要です。 (リダイレクト全般共通の注意点です) 安定的に動かすためには、 echo %変数% > ファイル として、このスペース分と改行2バイトの計2バイトが余計に付与されている、と見なす方がいいと思います。 |
|
470) Re4:Len ふぇむ 2003/07/28(月) 14:11 |
|
>として、このスペース分と改行2バイトの計2バイトが余計に付与されている、と見なす方がいいと思います。 計3バイト、の書き間違いですね。すみません.... |
|
468) Re2:Len ふぇむ 2003/07/28(月) 14:02 |
|
>じっくり考えると、別の手段で、あっと驚くような裏ワザ的な解決手段があるかもしれませんが、もしできたとしても結構厄介でしょうね。 と書いてるそばで思いついたので書きます。 変数の参照で部分文字列を得る参照方法があります。 %変数:~何文字目以降から,何文字% みたいな。 この、「何文字目以降から」の部分を1づつ増やしながら、結果得られる参照文字列が空文字になるまでループさせられれば、長さがわかると思います(これは文字数で、全角は1文字になる)。 この方針でいくならば、次に「どうやってその"何文字目"の部分を変数的にループさせるか」ですが、若干やっかいですが、変数の内容をコマンドとして評価 できること、 for 文がコマンドの実行結果を変数に得られること、を組み合わせることで実現は可能です。手元にある過去作成したスクリプトからみつくろって組むことはできる と思います。ただ、結構難解で長いスクリプトになると予想されます。そこまでしてこだわる必然性があるかどうかですが、どうでしょう? |
|
474) Re3:Len ふぇむ 2003/07/28(月) 15:35 |
|
>この、「何文字目以降から」の部分を1づつ増やしながら、結果得られる参照文字列が空文字になるまでループさせられれば、長さがわかると思います(これは文字数で、全角は1文字になる)。 面白そうなんで、ちょいと書いてみました。思ったよりシンプルですね。 以下です。Windows2000pro で動きます。NT4.0だとだめでしょう。 (若干ミスがあったので、消して再アップしました) (その後不要なステップをちょっと削りました~for文は不要でしたね) --------------- @echo off rem rem 第一引数に与えられた文字列の文字数を返すバッチコマンド rem rem 文字列にスペースを含む場合は全体を "" でくくって渡すこと rem setlocal set TARGET=%~1 call :LENGTH_CHECK "%TARGET%" LEN echo -- [%TARGET%] の長さは %LEN% 文字 goto :end rem ----------------- rem 機能群 rem ----------------- :LENGTH_CHECK set __LEN=-1 call :LENGTH_CHECK_entry "%~1" set %2=%__LEN% goto :eof :LENGTH_CHECK_entry set __ARG1=%~1 if "%__ARG1%" == "" ( set __LEN=0 goto :LENGTH_CHECK_exit ) set LENGTH_CHECK_STATUS=LOOP_CONTINUE :LENGTH_CHECK_loop set /a __LEN=__LEN + 1 set SETCMD=%%__ARG1:~%__LEN%,1%% call :LENGTH_CHECK_strcheck "%SETCMD%" if "%LENGTH_CHECK_STATUS%" == "LOOP_CONTINUE" goto :LENGTH_CHECK_loop :LENGTH_CHECK_exit goto :eof :LENGTH_CHECK_strcheck set __RESULTSTR=x%~1x if "%__RESULTSTR%" == "xx" set LENGTH_CHECK_STATUS=LOOP_END goto :eof :end endlocal |