在for语句中运行命令给我自己运行的命令不同的结果?

时间:2012-08-31 10:06:20

标签: windows for-loop batch-file cmd

我正在尝试使用批处理文件在.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)

我希望回声与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的结果不同?< / p>

2 个答案:

答案 0 :(得分:2)

看起来您正在使用二进制文件。

CMD不能很好地使用空字符。

此外,CMD每行限制为8191个字符。

所以看起来你使用CMD的努力注定要失败,除非你使用一些可以处理二进制文件的第三方工具。或者切换到另一种语言,如VBScript或JScript。

答案 1 :(得分:0)

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

但是,我有两个建议。

  1. 阅读variable expansion in loops。在循环中设置变量不会像人们假设的那样工作。

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

  3. 划痕计划:

    @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