1

バッチ ファイルを使用して .cfg ファイルの特定のセクションを見つけ、それを変数として使用しようとしています。

具体的には、Idapi32.cfg (Borland 構成ファイル) を読み取って、その中のエイリアスへのパスを見つけようとしています。

これをきちんと行う方法が思いつかなかったので、これをやろうとしました:
- CMD の TYPE 機能を使用して、.cfg ファイルを文字列 (1 行のテキスト) として取得し、この文字列を変数
- その変数の最初の 5 文字を取得し、IF string1==string2 を使用して、最初の 5 文字が必要なセクションである
かどうかを確認します。そうでない場合は、変数をリセットして、最初の文字を引いた同じになるようにし、もう一度確認します。

ループが機能していることを確認できるため、ループが機能することはわかっていますが、実行ごとに異なる結果が得られる理由がわかりません

TYPE "C:\programdata\borland shared\bde\idapi32.cfg"

for /f "usebackq tokens=* delims==" %%a in (`type "c:\programdata\borland shared\bde\idapi32.cfg"`) do (echo %%a)

エコーはTYPEコマンドの結果と同じであると思いますか?? それとも私は何かを逃していますか??

編集
結果の違いを示すために、TYPE と FOR の結果を追加しました

C:\>type "C:\programdata\borland shared\bde\idapi32.cfg"
♥   DRIVERS ☺ ♥   PARADOX ☺ ♥   INIT ☺ ♥ ☺ NET DIR ♦ W:\WINFILES ☻ ☻ ☻ ♥   DATAB
ASES ☺ ♥   MS Access Database ☺ ♥   DB OPEN ☺ ♥ ☺ DATABASE NAME ♦  ♥ ☺ USER NAME
 ♦  ♥ ☺ ODBC DSN ♦ MS Access Database ♥ ☺ OPEN MODE ♦ READ/WRITE ♥ ☺ SCHEMA CACH
E SIZE ♦ 8 ♥ ☺ SQLQRYMODE ♦  ♥ ☺ LANGDRIVER ♦  ♥ ☺ SQLPASSTHRU MODE ♦ SHARED AUT
OCOMMIT ♥ ☺ SCHEMA CACHE TIME ♦ -1 ♥ ☺ MAX ROWS ♦ -1 ♥ ☺ BATCH COUNT ♦ 200 ♥ ☺ E
NABLE SCHEMA CACHE ♦ FALSE ♥ ☺ SCHEMA CACHE DIR ♦  ♥ ☺ ENABLE BCD ♦ FALSE ♥ ☺ RO
WSET SIZE ♦ 20 ♥ ☺ BLOBS TO CACHE ♦ 64 ☻ ♥   DB INFO ☺ ♥ ☺ TYPE ♦ Microsoft Acce
ss Driver (*.mdb) ♥ ☺ PATH ♦  ☻ ☻ ♥   Excel Files ☺ ♥   DB OPEN ☺ ♥ ☺ DATABASE N
AME ♦  ♥ ☺ USER NAME ♦  ♥ ☺ ODBC DSN ♦ Excel Files ♥ ☺ OPEN MODE ♦ READ/WRITE ♥
☺ SCHEMA CACHE SIZE ♦ 8 ♥ ☺ SQLQRYMODE ♦  ♥ ☺ LANGDRIVER ♦  ♥ ☺ SQLPASSTHRU MODE
 ♦ SHARED AUTOCOMMIT ♥ ☺ SCHEMA CACHE TIME ♦ -1 ♥ ☺ MAX ROWS ♦ -1 ♥ ☺ BATCH COUN
T ♦ 200 ♥ ☺ ENABLE SCHEMA CACHE ♦ FALSE ♥ ☺ SCHEMA CACHE DIR ♦  ♥ ☺ ENABLE BCD ♦
 FALSE ♥ ☺ ROWSET SIZE ♦ 20 ♥ ☺ BLOBS TO CACHE ♦ 64 ☻ ♥   DB INFO ☺ ♥ ☺ TYPE ♦ M
icrosoft Excel Driver (*.xls) ♥ ☺ PATH ♦  ☻ ☻ ♥   dBASE Files ☺ ♥   DB OPEN ☺ ♥
☺ DATABASE NAME ♦  ♥ ☺ USER NAME ♦  ♥ ☺ ODBC DSN ♦ dBASE Files ♥ ☺ OPEN MODE ♦ R
EAD/WRITE ♥ ☺ SCHEMA CACHE SIZE ♦ 8 ♥ ☺ SQLQRYMODE ♦  ♥ ☺ LANGDRIVER ♦  ♥ ☺ SQLP
ASSTHRU MODE ♦ SHARED AUTOCOMMIT ♥ ☺ SCHEMA CACHE TIME ♦ -1 ♥ ☺ MAX ROWS ♦ -1 ♥
☺ BATCH COUNT ♦ 200 ♥ ☺ ENABLE SCHEMA CACHE ♦ FALSE ♥ ☺ SCHEMA CACHE DIR ♦  ♥ ☺
ENABLE BCD ♦ FALSE ♥ ☺ ROWSET SIZE ♦ 20 ♥ ☺ BLOBS TO CACHE ♦ 64 ☻ ♥   DB INFO ☺
♥ ☺ TYPE ♦ Microsoft dBase Driver (*.dbf) ♥ ☺ PATH ♦  ☻ ☻ ♥   Text Files ☺ ♥   D
B OPEN ☺ ♥ ☺ DATABASE NAME ♦  ♥ ☺ USER NAME ♦  ♥ ☺ ODBC DSN ♦ Text Files ♥ ☺ OPE
N MODE ♦ READ/WRITE ♥ ☺ SCHEMA CACHE SIZE ♦ 8 ♥ ☺ SQLQRYMODE ♦  ♥ ☺ LANGDRIVER ♦
♥ ☺ SQLPASSTHRU MODE ♦ SHARED AUTOCOMMIT ♥ ☺ SCHEMA CACHE TIME ♦ -1 ♥ ☺ MAX ROWS 
♦ -1 ♥ ☺ BATCH COUNT ♦ 200 ♥ ☺ ENABLE SCHEMA CACHE ♦ FALSE ♥ ☺ SCHEMA CACHE DIR 
♦  ♥ ☺ ENABLE BCD ♦ FALSE ♥ ☺ ROWSET SIZE ♦ 20 ♥ ☺ BLOBS TO CACHE ♦ 64 ☻ ♥ DB IN
FO ☺ ♥ ☺ TYPE ♦ Microsoft Text Driver (*.txt; *.csv) ♥ ☺ PATH ♦  ☻ ☻ ♥   MS Acce
ss 97 Database ☺ ♥   DB OPEN ☺ ♥ ☺ DATABASE NAME ♦  ♥ ☺ USER NAME ♦  ♥ ☺ ODBC DS
N ♦ MS Access 97 Database ♥ ☺ OPEN MODE ♦ READ/WRITE ♥ ☺ SCHEMA CACHE SIZE ♦ 8 ♥
 ☺ SQLQRYMODE ♦  ♥ ☺ LANGDRIVER ♦  ♥ ☺ SQLPASSTHRU MODE ♦ SHARED AUTOCOMMIT ♥ ☺ 
SCHEMA CACHE TIME ♦ -1 ♥ ☺ MAX ROWS ♦ -1 ♥ ☺ BATCH COUNT ♦ 200 ♥ ☺ ENABLE SCHEMA
 CACHE ♦ FALSE ♥ ☺ SCHEMA CACHE DIR ♦  ♥ ☺ ENABLE BCD ♦ FALSE ♥ ☺ ROWSET SIZE ♦ 
20 ♥ ☺ BLOBS TO CACHE ♦ 64 ☻ ♥   DB INFO ☺ ♥ ☺ TYPE ♦ Microsoft Access Driver (*
.mdb) ♥ ☺ PATH ♦  ☻ ☻ ♥   NewSites ☺ ♥   DB INFO ☺ ♥ ☺ TYPE ♦ STANDARD ♥ ☺ PATH 
♦ C:\welcome\progs\sitesdatasetups\hoste\book ♥ ☺ ENABLE BCD ♦ FALSE ♥ ☺ DEFAULT
 DRIVER ♦ PARADOX ☻ ☻ ♥   WinPOS32DB ☺ ♥   DB INFO ☺ ♥ ☺ TYPE ♦ STANDARD ♥ ☺ PAT
H ♦ C:\TaskPOS\WINPOS~1\ ♥ ☺ ENABLE BCD ♦ FALSE ♥ ☺ DEFAULT DRIVER ♦ Paradox ☻ ☻
 ♥   PreparationDB ☺ ♥   DB INFO ☺ ♥ ☺ TYPE ♦ STANDARD ♥ ☺ PATH ♦ C:\TaskPOS\Win
POS32DB ♥ ☺ ENABLE BCD ♦ FALSE ♥ ☺ DEFAULT DRIVER ♦ PARADOX ☻ ☻ ♥   IOLiteW21125
25165259313 ☺ ♥   DB INFO ☺ ♥ ☺ TYPE ♦ STANDARD ♥ ☺ PATH ♦ W:\Book ♥ ☺ ENAB

それは続きます...

C:\>for /f "usebackq tokens=* delims==" %a in (`type "c:\programdata\borland sha
red\bde\idapi32.cfg"`) do (echo %a)

C:\>(echo ♥SQLQRYMODE♦IOLiteW2112525165259313☻ )
♥SQLQRYMODE♦IOLiteW2112525165259313☻

上記の「TYPE」コマンドの完全な結果を変数に入れることができれば、それで作業できます(と思います)... FORの結果が異なる理由がわかりませんか?

4

2 に答える 2

2

バイナリファイルを扱っているようです。

CMD はヌル文字ではうまく機能しません。

また、CMD は 1 行あたり 8191 文字に制限されています。

そのため、バイナリ ファイルを処理できるサードパーティ製のツールを使用しない限り、CMD を使用する努力は無駄になるようです。または、VBScript や JScript などの別の言語に切り替えます。

于 2012-08-31T12:35:41.453 に答える
0

私はあなたの問題を再現できません - 私の場合、出力はまったく同じです (私のコードについては、以下のスクラッチ プログラムを参照してください)。

ただし、2 つの提案があります。

  1. ループ内の変数展開について読んでください。ループ内で変数を設定しても、想定どおりには機能しません。

  2. TYPE の代わりに FINDSTR を使用することをお勧めします。より簡単に使用できるはずです。以下のコードの最後に例を示します。

スクラッチプログラム:

@ECHO OFF

ECHO Param1=Value1 > config.cfg
ECHO Param2=Value2 >> config.cfg
ECHO Param3=Value3 >> config.cfg

ECHO Echo configuration File using TYPE
ECHO.

TYPE config.cfg

ECHO.
ECHO Outputting config file using LOOP
ECHO.

for /f "usebackq tokens=* delims==" %%a in (`type config.cfg`) do (echo %%a)

ECHO.
ECHO Searching for %1

REM /B means "find at beginning of word"
REM /I means "search is case insensitive"
FINDSTR /B /I %1 config.cfg
于 2012-08-31T10:47:34.723 に答える