Windows 在for语句中运行命令会给我与单独运行命令不同的结果吗?

Windows 在for语句中运行命令会给我与单独运行命令不同的结果吗?,windows,for-loop,batch-file,cmd,Windows,For Loop,Batch File,Cmd,我试图使用批处理文件来查找.cfg文件中的特定部分,并将其用作变量 具体来说,我正在尝试读取Idapi32.cfg(Borland配置文件),以找到其中一个别名的路径 我想不出任何方法可以干净利落地做到这一点,所以我一直在尝试: -使用CMD的TYPE功能将.cfg文件作为字符串(其一行文本)获取,并将该字符串设置为变量 -取该变量的前五个字符,使用IF string1==string2查看前五个字符是否是我需要的部分 -如果没有,请将变量重置为相同减去第一个字符,然后再次检查 我知道我的循环是

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

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

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

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

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

我希望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的结果不同?

我无法重现您的问题-对我来说,输出完全相同(请参阅下面的scratch程序了解我的代码)

不过,我有两个建议

  • 仔细阅读。在循环中设置变量的方式与假设的方式不同

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

  • Scratch程序:

    @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
    

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

    CMD不能很好地处理空字符

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


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

    我认为问题可能是两件事之一。。。单行很长(我的假设是TYPE和FOR将占用CMD所能处理的最大数量,并删除剩余部分??),或者可能与off字符有关(CMD将它们解释为笑脸、心形等。记事本将它们显示为空格。Findstr不起作用,因为我需要能够设置一个变量作为字符串,从找到字符串后大约10个字符开始。我认为在某个地方会有一个障碍阻止我……无论如何,像dbenham所说的,这不是一个好主意使用纯批处理,但无论如何都可以这样做
    @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