[前の記事]« レジストリファイルを他のPCにインポートしたい
[次の記事]起動時の引数のうち、最後の引数しか取得できない »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「FOR .. IN ( ) DO..」索引へ

特定条件下のFor文の実行で謎のビープ音

1101.
For文でリテラル文字列を使う場合のバグ?
2006年05月07日(日) 15時04分
mak
以下のバッチを保存して実行すると文字化けや
奇怪なBEEP音が発生します。
forでリテラル文字を使う場合のバグと見受けられますが、
バッチの記述以外でレジストリ等で回避する方法は
ありますか?

sample-----------------------------------------
@echo off
REM 6行目のgoto文をコメントアウトすると、
REM 文字化け、謎のBEEP音が発生します。
for /f "usebackq tokens=1,2,3,4* delims= " %%a in ('aa bb cc dd ddd') do (
echo %%a %%b %%c %%d
rem goto end_for
)
:end_for

goto :eof
----------------------------------------------
1102.
Re:For文でリテラル文字列を使う場合のバグ?
2006年05月08日(月) 15時29分
otn
>以下のバッチを保存して実行すると文字化けや
>奇怪なBEEP音が発生します。
>forでリテラル文字を使う場合のバグと見受けられますが、
>バッチの記述以外でレジストリ等で回避する方法は
>ありますか?

6行目はremになっているので、このままの状態で異常が起こるということですよね。少なくともWindowsXP/SP2では起こりません。OSは何でしょう?

' ' の中の文字列を他のものに変えても起こりますか?

文字化けやBEEP音というのは、バイナリファイルをtypeしたときのような状況ということですか?具体的に何が起こっているかわかりますか?
1103.
Re:For文でリテラル文字列を使う場合のバグ?
2006年05月09日(火) 02時10分
mak
>6行目はremになっているので、このままの状態で異常が起こるということですよね。
> 少なくともWindowsXP/SP2では起こりません。OSは何でしょう?

失礼しました。OSはXP Pro Sp2です。
再現手順ももう少し丁寧に書き直します。

1. バッチを例えばAAA.batで保存する。
2. Explorerからでなく必ずcmd.exeを起動して
   AAA.batを実行する
3. 実行後、F3キーか、カーソル上キーを押し、
  直前の命令を表示させてエンターキーを押す。
4. 20回ほど繰り返す。

これで、文字化けやBeep音などが発生します。
(いつも起こるのではなく、繰り返しているとおきる現象なので
 explorerではなくcmd.exe上で試して下さい)

ちなみにですが、有名なリダイレクトバグのレジストリ修正
は充てていない状態です。
(\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
CurrentVersion\policies\Explorer\InheritConsoleHandles
は設定していないという意味です。)

・私が試したすべてXP SP2で発生します。
・書き込みのままのバッチを実行すると文字化けや
 謎のBeep音が発生します。
・6行目からREMを取りgoto文を有効にするとエラーが発生しなく
 なります。

以下はこちらで繰り返した文字化け結果を貼り付け
たいのですが「使用できない文字が含まれています」、
と表示され貼り付けられませんでした。

1104.
Re:For文でリテラル文字列を使う場合のバグ?
2006年05月09日(火) 13時24分
otn
otnです。

>失礼しました。OSはXP Pro Sp2です。

同じく。

>再現手順ももう少し丁寧に書き直します。
>3. 実行後、F3キーか、カーソル上キーを押し、
>  直前の命令を表示させてエンターキーを押す。

確かに何度か繰り返すと出ますね。化け字を*で置き換えると、

aa bb cc dd
ファイル
G******プト - aaa が見つかりません。

とか、

aa bb cc dd
ファイル o***** が見つかりません

とか、

aa bb cc dd
ファイル
*******、謎のBEEP音が発生します。 が見つかりません。

最後のを見ると、明らかにBATファイル中のREM文の途中から実行しようとしているようだし、最初のはウィンドウタイトルの一部ですね。つまりメモリ上の何らかのエリアのデータをコマンドだとして実行しようとしている。

いずれも aa bb cc dd は表示されているので、forがおかしいのは確か。
usebackqをやめて ' を " にすると出ないようです。
また、usebackqでもファイルから読んだりコマンド実行とかだと出ないですね。
文字列の内容によっても、発生頻度が異なる。

>ちなみにですが、有名なリダイレクトバグのレジストリ修正
>は充てていない状態です。
>(\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
>CurrentVersion\policies\Explorer\InheritConsoleHandles
>は設定していないという意味です。)

有名とは知りませんでした。ただ、InheritConsoleHandles でgoogle検索しても日本語ページはMicrosoft以外では私の書いたものしか見当たらないのですが、どのあたりで有名なのでしょう?
なおこの値は結果には影響しないようです。もしかしたら発生頻度とか発生文字列に微妙に影響しているのかもしれませんが、元が再現性の弱い障害なので判断できず。

>・6行目からREMを取りgoto文を有効にするとエラーが発生しなく
> なります。

おそらく、usebackq と ' の組み合わせだけで起こる障害ではないでしょうか。文字列からの読み取りだと1回だけだけど、コマンド実行だとループを回るわけですが、' の処理の途中からusebackqのフラグを見ないでコマンド実行処理に行っちゃってる。

usebackq が必要なケースは空白を含んでいる(かもしれない)パス名のファイルから読む場合だけなんで、それ以外のケースでは usebackq を使わなければ実害はなさそうです。

なお、Windows2000SP4でも起こりました。
1106.
Re:For文でリテラル文字列を使う場合のバグ?
2006年05月09日(火) 14時30分
otn
otnです。
本題を忘れていました。
>バッチの記述以外でレジストリ等で回避する方法は
>ありますか?

usebackqを使わないように書き直せないとすると、cmd起動直後の初回は大丈夫そうなので、
cmd /c aaa
と実行するというのは駄目ですか?

1107.
Re:For文でリテラル文字列を使う場合のバグ?
2006年05月10日(水) 03時00分
mak
>usebackqをやめて ' を " にすると出ないようです。
>また、usebackqでもファイルから読んだりコマンド実行とかだと出ないですね。

大変有用な情報を頂きありがとうございます。
その手で行きます。



>有名とは知りませんでした。ただ、InheritConsoleHandles でgoogle検索しても日本語ページはMicrosoft以外では私の書いたものしか見当たらないのですが、どのあたりで有名なのでしょう?

別の検索をしていたとき、いくつかのサイトで問題の件を記事にしていました。
そういえばGoogleだとMSかOtnさんのサイト?しか出ないようです。

otnさんのサイトへのリンクという形でいくつかのサイトで
話題になっていましたが、Googleは(確かリンクされているサイトを表示するので)
otnさんとMSのしか出ないようですね。




 
 


カテゴリー「FOR .. IN ( ) DO..」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2006年05月07日 15:58に投稿されたエントリーのページです。

ひとつ前の投稿は「レジストリファイルを他のPCにインポートしたい」です。

次の投稿は「起動時の引数のうち、最後の引数しか取得できない」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート