バグ
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
''cmd.exeビルトイン関係のバグについて''~
''外部コマンドのバグについては、[[コマンド別]] に記す''
#contents
/////////////////////////////////////////////////////////...
*for /f %A in ('command ....') の日本語処理のバグ (Win2K)...
for /f %%A in ('echo あいう123456789') do echo %%A
for /f %%A in ('echo あ123456789') do echo %%A
では、それぞれ、「あいう123456789」「あ123456789」が表示...
WinXPでは直っているのにWin2000の最新SPでも直っていないと...
現実的には、
for /f "delims=" %%A in ('find "日本語" filename') do ....
のようなケースで問題になるだろう。2バイト文字の数が分かっ...
for /f "delims=" %%A in ('find "日本語" filename@@@') do...
のようにその数だけ余分の文字をあらかじめ末尾に付けて置け...
for /f "delims=" %%A in ('find "%STR%" filename^|findstr...
のように末尾からある程度文字が消えても良いようにする必要...
あるいは、一時ファイルを使って、
find "%STR%" filename > tempfile.tmp
for /f "delims=" %%A in (tempfile.tmp) do ....
del tempfile.tmp
これも、せっかくコマンド結果取得の構文があるのに使わない...
情けないことに変わり無い。
/////////////////////////////////////////////////////////...
*%~sA のバグ [#geb5e062]
for変数や、バッチ引数には、%~sA や %~s1 という修飾子でシ...
md "long long long dir"
cd "long long long dir"
echo.>"A B.txt"
for %%A in (*.txt) do echo %%~sA
本来は、「\LONGLO~1\ABBE64~1.TXT」 のように表示されるべき...
こういうバグがある以上、特定の環境で一時的に使うバッチな...
解決法としては、パスの上位部分から順にSFN形式にしていくし...
:sfnsub の仕様としては、" "で囲んだフルパスを引数にすると...
@echo off
setlocal
rem サンプルメイン
for %%A in ("A B.txt") do echo %%~sA&call :sfnsub "%%~fA"
echo %SFN%
goto :eof
rem サブルーチン
:sfnsub
set ARG=%1
set ARG=%ARG:\=\" "%
set SFN=
call :loop %ARG%
goto :eof
:loop
for %%A in ("%SFN%%~1") do set SFN=%%~sA
shift
if not "%~1"=="" goto :loop
set "SFN=%SFN:&=^&%"
set "SFN=%SFN:^^=^%"
goto :eof
2006-09-05追記
上記だとパス中に ^ を含んだ場合に駄目なようだ。考慮したつ...
下記のように:loopを変更すると行けるようだが引き続き検証す...
:loop
set "W=%~1"
set "W=%W:^^^^=^"
for %%A in ("%SFN%%W%") do set SFN=%%~sA
shift
if not "%~1"=="" goto :loop
set "SFN=%SFN:&=^&%"
set "SFN=%SFN:^^=^%"
goto :eof
2006-09-05追記 終わり
汎用と書いたが、% はスクリプト中でサブルーチンの引数とし...
なお、この方法と別に COMMAND.COM を使ってカレントディレク...
@echo off
setlocal
for %%A in ("A B.txt") do echo %%~sA&call :sfnsub "%%~fA"
echo %SFN%
goto :eof
:sfnsub
pushd "%~dp1"
command /c rem
for %%A in ("%~nx1") do set SFN=%%~sA
popd
goto :eof
こっちのほうがわかりやすい。ただし、日本語版Windowsの場合...
いずれにせよたかがSFNを得るために大げさな話であり、スクリ...
\Program Files\ の下だけ調べてみたが、%~sA が正しい結果を...
ある。
for /r "C:\Program Files" %%A in (*) do if not exist %%~...
/////////////////////////////////////////////////////////...
*スクリプト言語の入出力リダイレクト [#ce52c564]
Perl,Rubyなどのスクリプトを、拡張子をコマンドに関連付けた...
PATHEXT環境変数に ;.pl;.rb を追加することで、
PATHの通ったフォルダにあればスクリプト名だけで起動できる。
VBScript, JavaScript は標準で関連付けられてPATHEXTにも拡...
ただしBAT,CMD以外のスクリプトを拡張子関連付けで起動した場...
Win2KはSP4, WinXPはSP1でこのバグが修正されている。
しかし、何故かレジストリを修正しないと有効にならない。バ...
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVe...
DWord値 InheritConsoleHandles を作成して、1 をセットする
以降、起動したコマンドプロンプトからリダイレクト・パイプ...
/////////////////////////////////////////////////////////...
*拡張子関連付け起動で拡張子が無視されexeファイルと見なさ...
copy %WINDIR%\system32\calc.exe %TEMP%\abc.txt
と、電卓コマンドを拡張子.txtとしてコピーしてみる。~
abc.txtをexplorerからファイルをダブルクリックしての起動や...
しかし、コマンドプロンプトから、%TEMP%\abc.txt と打つと、...
どうもファイル先頭の2バイトが"MZ"だと、拡張子に関係なくex...
理由が理解できない仕様で、セキュリティーホールだと思うが...
/////////////////////////////////////////////////////////...
*echo. と遅延展開 [#p7394ae4]
遅延展開を有効にした状態で、echo.!CD:~0,2! とするとカレン...
することを期待するが、実際には、CD:~0,2 という文字列が表...
詳細は [[コマンド別/echo]] を参照。
/////////////////////////////////////////////////////////...
*pause 解除時に特殊キーを押した場合 [#uc79929d]
処理1
pause
処理2
pause
のように2つの処理が終わるごとに処理を止める目的でそれぞれ...
最初のpauseでファンクションキーやカーソル、INS/DELなどの...
キーコードが2バイトのせいか2つ目のpauseまで通り過ぎてしま...
/////////////////////////////////////////////////////////...
終了行:
''cmd.exeビルトイン関係のバグについて''~
''外部コマンドのバグについては、[[コマンド別]] に記す''
#contents
/////////////////////////////////////////////////////////...
*for /f %A in ('command ....') の日本語処理のバグ (Win2K)...
for /f %%A in ('echo あいう123456789') do echo %%A
for /f %%A in ('echo あ123456789') do echo %%A
では、それぞれ、「あいう123456789」「あ123456789」が表示...
WinXPでは直っているのにWin2000の最新SPでも直っていないと...
現実的には、
for /f "delims=" %%A in ('find "日本語" filename') do ....
のようなケースで問題になるだろう。2バイト文字の数が分かっ...
for /f "delims=" %%A in ('find "日本語" filename@@@') do...
のようにその数だけ余分の文字をあらかじめ末尾に付けて置け...
for /f "delims=" %%A in ('find "%STR%" filename^|findstr...
のように末尾からある程度文字が消えても良いようにする必要...
あるいは、一時ファイルを使って、
find "%STR%" filename > tempfile.tmp
for /f "delims=" %%A in (tempfile.tmp) do ....
del tempfile.tmp
これも、せっかくコマンド結果取得の構文があるのに使わない...
情けないことに変わり無い。
/////////////////////////////////////////////////////////...
*%~sA のバグ [#geb5e062]
for変数や、バッチ引数には、%~sA や %~s1 という修飾子でシ...
md "long long long dir"
cd "long long long dir"
echo.>"A B.txt"
for %%A in (*.txt) do echo %%~sA
本来は、「\LONGLO~1\ABBE64~1.TXT」 のように表示されるべき...
こういうバグがある以上、特定の環境で一時的に使うバッチな...
解決法としては、パスの上位部分から順にSFN形式にしていくし...
:sfnsub の仕様としては、" "で囲んだフルパスを引数にすると...
@echo off
setlocal
rem サンプルメイン
for %%A in ("A B.txt") do echo %%~sA&call :sfnsub "%%~fA"
echo %SFN%
goto :eof
rem サブルーチン
:sfnsub
set ARG=%1
set ARG=%ARG:\=\" "%
set SFN=
call :loop %ARG%
goto :eof
:loop
for %%A in ("%SFN%%~1") do set SFN=%%~sA
shift
if not "%~1"=="" goto :loop
set "SFN=%SFN:&=^&%"
set "SFN=%SFN:^^=^%"
goto :eof
2006-09-05追記
上記だとパス中に ^ を含んだ場合に駄目なようだ。考慮したつ...
下記のように:loopを変更すると行けるようだが引き続き検証す...
:loop
set "W=%~1"
set "W=%W:^^^^=^"
for %%A in ("%SFN%%W%") do set SFN=%%~sA
shift
if not "%~1"=="" goto :loop
set "SFN=%SFN:&=^&%"
set "SFN=%SFN:^^=^%"
goto :eof
2006-09-05追記 終わり
汎用と書いたが、% はスクリプト中でサブルーチンの引数とし...
なお、この方法と別に COMMAND.COM を使ってカレントディレク...
@echo off
setlocal
for %%A in ("A B.txt") do echo %%~sA&call :sfnsub "%%~fA"
echo %SFN%
goto :eof
:sfnsub
pushd "%~dp1"
command /c rem
for %%A in ("%~nx1") do set SFN=%%~sA
popd
goto :eof
こっちのほうがわかりやすい。ただし、日本語版Windowsの場合...
いずれにせよたかがSFNを得るために大げさな話であり、スクリ...
\Program Files\ の下だけ調べてみたが、%~sA が正しい結果を...
ある。
for /r "C:\Program Files" %%A in (*) do if not exist %%~...
/////////////////////////////////////////////////////////...
*スクリプト言語の入出力リダイレクト [#ce52c564]
Perl,Rubyなどのスクリプトを、拡張子をコマンドに関連付けた...
PATHEXT環境変数に ;.pl;.rb を追加することで、
PATHの通ったフォルダにあればスクリプト名だけで起動できる。
VBScript, JavaScript は標準で関連付けられてPATHEXTにも拡...
ただしBAT,CMD以外のスクリプトを拡張子関連付けで起動した場...
Win2KはSP4, WinXPはSP1でこのバグが修正されている。
しかし、何故かレジストリを修正しないと有効にならない。バ...
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVe...
DWord値 InheritConsoleHandles を作成して、1 をセットする
以降、起動したコマンドプロンプトからリダイレクト・パイプ...
/////////////////////////////////////////////////////////...
*拡張子関連付け起動で拡張子が無視されexeファイルと見なさ...
copy %WINDIR%\system32\calc.exe %TEMP%\abc.txt
と、電卓コマンドを拡張子.txtとしてコピーしてみる。~
abc.txtをexplorerからファイルをダブルクリックしての起動や...
しかし、コマンドプロンプトから、%TEMP%\abc.txt と打つと、...
どうもファイル先頭の2バイトが"MZ"だと、拡張子に関係なくex...
理由が理解できない仕様で、セキュリティーホールだと思うが...
/////////////////////////////////////////////////////////...
*echo. と遅延展開 [#p7394ae4]
遅延展開を有効にした状態で、echo.!CD:~0,2! とするとカレン...
することを期待するが、実際には、CD:~0,2 という文字列が表...
詳細は [[コマンド別/echo]] を参照。
/////////////////////////////////////////////////////////...
*pause 解除時に特殊キーを押した場合 [#uc79929d]
処理1
pause
処理2
pause
のように2つの処理が終わるごとに処理を止める目的でそれぞれ...
最初のpauseでファンクションキーやカーソル、INS/DELなどの...
キーコードが2バイトのせいか2つ目のpauseまで通り過ぎてしま...
/////////////////////////////////////////////////////////...
ページ名: