我正在尝试使用batch file在.cfg文件中查找特定部分,并将其用作variables。
具体来说,我试图阅读Idapi32.cfg(Borland的configuration文件),以find一个别名的path里面。
我想不出有什么办法做到这一点,所以我一直在试图做到这一点:
– 使用CMD的TYPEfunction将.cfg文件作为一个string(它的一行文本)并将此string设置为一个variables
– 取该variables的前五个字符,并使用IF string1 == string2来查看前五个字符是否是我需要的部分
– 如果没有,重置variables是相同的减去第一个字符并再次检查。
我知道我的循环工作,因为我可以看到它的工作,但我不明白为什么我得到不同的结果之间运行
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”命令的全部结果到一个variables,我可以使用它(我认为)…我只是不知道为什么FOR的结果是不同的?
看起来你正在使用二进制文件。
CMD不能和空字符一起玩。
CMD每行限制为8191个字符。
所以看起来你使用CMD的努力是注定的,除非你使用一些可以处理二进制文件的第三方工具。 或者切换到另一种语言,如VBScript或JScript。
我不能重现你的问题 – 对我来说,输出是完全一样的(见我的代码下面的scratch程序)。
不过,我有两个建议。
阅读循环中的变量扩展 。 在循环中设置一个变量不会按照人们假设的方式工作。
我建议使用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