1

我正在尝试使用批处理文件来查找 .cfg 文件中的特定部分,并将其用作变量。

具体来说,我正在尝试读取 Idapi32.cfg(Borland 配置文件),以找到其中一个别名的路径。

我想不出任何方法可以巧妙地做到这一点,所以我一直在尝试这样做:
- 使用 CMD 的 TYPE 功能将 .cfg 文件作为字符串(它的一行文本)并将此字符串设置为变量
- 获取该变量的前五个字符,并使用 IF string1==string2 查看前五个字符是否是我需要的部分
- 如果不是,将变量重置为相同减去第一个字符并再次检查。

我知道我的循环有效,因为我可以看到它有效,但我不明白为什么我在运行之间得到不同的结果

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)

我希望 echo 与 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 限制为每行 8191 个字符。

因此,除非您使用一些可以处理二进制文件的第三方工具,否则您使用 CMD 的努力似乎注定要失败。或者切换到另一种语言,如 VBScript 或 JScript。

于 2012-08-31T12:35:41.453 回答
0

我无法重现您的问题 - 对我来说,输出完全相同(请参阅下面的临时程序以获取我的代码)。

不过,我有两个建议。

  1. 阅读循环中的变量扩展。在循环中设置变量并不像人们想象的那样起作用。

  2. 我建议使用 FINDSTR 而不是 TYPE 因为它应该更容易使用 - 我在下面的代码末尾给出了一个示例。

划痕计划:

@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 回答