Board logo

标题: [已解決]將兩多只差別分析檔案不同的批處理程序簡化 [打印本页]

作者: XZ     时间: 2008-7-20 14:04    标题: [已解決]將兩多只差別分析檔案不同的批處理程序簡化

請問如下將下面的批處理簡化 當從DB-1~DB-10 這樣就要寫成好大一串 但是差別的只有檔案名稱與輸出的解果 謝謝!!
set DB-1=DB-1-Chip.ini
set DB-2=DB-2-Display.ini
set DB-3=DB-2-Audio.ini
set DB-4=DB-4-.ini
set DB-5=DB-5-.ini
set DB-9=DB-9-Vendor.ini

echo.
SET xxxxx=%~dp0
set source=%xxxxx:~0,-1%
echo Source Path
echo %source%
pause

CALL :Processor-DB-1
CALL :Processor-DB-2
goto Zend


:Processor-DB-1
for /f "eol=# tokens=1,2,3* delims=	 usebackq" %%i in ( "%source%\9-DataBase\DB-1-Chip.ini" ) do (
set Match-DB-1-VDID=%%i 
set Match-DB-1-Name=%%j 
set Match-DB-1-Path=%%k 
:: "%source%\devcon" find pci\* | find /i "%%i" && goto Match-DB-2
reg query HKLM\SYSTEM\CurrentControlSet\Enum\PCI | find /i "%%i" >nul 2>nul && goto Match-DB-1
)
echo Sorry !!
echo No match chip is DB-1-Chip!
goto :eof

:Match-DB-1
echo Chip is 
echo %Match-DB-1-VDID:~0,8%^&%Match-DB-1-VDID:~-9%
echo %Match-DB-1-Name%
echo %Match-DB-1-Path%
echo.
goto :eof


:Processor-DB-2
for /f "eol=# tokens=1,2,3* delims=	 usebackq" %%i in ( "%source%\9-DataBase\DB-2-Display.ini" ) do (
set Match-DB-2-VDID=%%i 
set Match-DB-2-Name=%%j 
set Match-DB-2-Path=%%k 
:: "%source%\devcon" find pci\* | find /i "%%i" && goto Match-DB-2
reg query HKLM\SYSTEM\CurrentControlSet\Enum\PCI | find /i "%%i" >nul 2>nul && goto Match-DB-2
)
goto :eof

:Match-DB-2
echo Display is
echo %Match-DB-2-VDID:~0,8%^&%Match-DB-2-VDID:~-9%
echo %Match-DB-2-Name%
echo %Match-DB-2-Path%
echo.
goto :eof


:Zend
pause
結果:
Source Path
\\127.0.0.1\新資料夾\asdf 123\qwer 456
請按任意鍵繼續 . . .
Chip is
VEN_8086&DEV_27DF
Intel Chip 7
\INTEL\Chip\7Setup.exe

Display is
VEN_1002&DEV_9589
ATI Radeon HD 900 PRO
\ATI\2600PRo\9Setup.exe

請按任意鍵繼續 . . .
[ Last edited by XZ on 2008-7-24 at 09:51 PM ]

作者: lxmxn     时间: 2008-7-21 06:29
说实话,没听懂你要做什么。。

作者: XZ     时间: 2008-7-22 19:11
@@a 我表達能力太差了 就是 :Processor-DB-1 for /f "eol=# tokens=1,2,3* delims= usebackq" %%i in ( "%source%\9-DataBase\DB-1-Chip.ini" ) do ( set Match-DB-1-VDID=%%i set Match-DB-1-Name=%%j set Match-DB-1-Path=%%k reg query HKLM\SYSTEM\CurrentControlSet\Enum\PCI | find /i "%%i" >nul 2>nul && goto Match-DB-1 ) :Processor-DB-2 for /f "eol=# tokens=1,2,3* delims= usebackq" %%i in ( "%source%\9-DataBase\DB-2-Display.ini" ) do ( set Match-DB-2-VDID=%%i set Match-DB-2-Name=%%j set Match-DB-2-Path=%%k reg query HKLM\SYSTEM\CurrentControlSet\Enum\PCI | find /i "%%i" >nul 2>nul && goto Match-DB-2 ) 差別的地方就是 紅色和藍色的地方 請問要怎樣才能縮短批處理 因為一共有10個左右 DB-1-Chip.ini DB-2-Display.ini DB-3-Audio.ini DB-4-Lan.ini DB-5-...... DB-6-...... DB-7-...... DB-8-...... 勞帆各位解答了 若還有解釋不清楚的煩請告訴我一下 因為這實在是想不出來縮短的方法 只知道可能用 For /F 但是不知道怎了做 謝謝

作者: lxmxn     时间: 2008-7-22 21:35
@echo off&setlocal EnableDelayedExpansion

set DB-1=DB-1-Chip.ini
set DB-2=DB-2-Display.ini
set DB-3=DB-2-Audio.ini
set DB-4=DB-4-.ini
set DB-5=DB-5-.ini
set DB-9=DB-9-Vendor.ini

for %%a in (1,2,3,4,5,9) do call:loop %%a
pause&goto:EOF

:loop
for /f "eol=# tokens=1,2,3* delims=         usebackq" %%i in ( "%source%\9-DataBase\!DB-%~1!" ) do (
set Match-DB-%~1-VDID=%%i 
set Match-DB-%~1-Name=%%j 
set Match-DB-%~1-Path=%%k 
:: "%source%\devcon" find pci\* | find /i "%%i" && goto Match
reg query HKLM\SYSTEM\CurrentControlSet\Enum\PCI | find /i "%%i" >nul 2>nul && goto Match
)
echo Sorry !!
echo No match chip is !DB-%~1!
goto :eof

:Match
echo Chip is 
echo %Match-DB-%~1-VDID:~0,8%^&%Match-DB-%~1-VDID:~-9%
echo %Match-DB-%~1-Name%
echo %Match-DB-%~1-Path%
echo.
没有测试,不过可以看看for+call 的思路,用call传递可变参数。

作者: XZ     时间: 2008-7-24 20:05
感謝您!! 雖然還是不行 至少我多學到一樣關於FOR的應用 ^^ 我在想想看 不行的話就直接寫著10行^^" 批處理的學問還真深奧 內容:
setlocal enabledelayedexpansion

set DB-1=DB-1-Chip.ini
set DB-2=DB-2-Display.ini



echo on
SET xxxxx=%~dp0
set source=%xxxxx:~0,-1%
echo Source Paht is %Source%

for %%a in (1) do call:loop1 %%a
pause&goto:EOF


goto Zend

for %%a in (1,2,3,4,5,9) do call:loop %%a
pause&goto:EOF

:loop1
set aaa=!DB-%~1!
echo !DB-%~1!
for /f "eol=# tokens=1,2,3,4* delims=	 usebackq" %%i in ( "%source%\9-DataBase\!DB-%~1!" ) do (
set Match-DB-%~1-VDID=%%i 
set Match-DB-%~1-Name=%%j 
set Match-DB-%~1-Path=%%k
set Match-DB-%~1-Runs=%%l
set Match-DB-%~1-cmds=%%m
reg query HKLM\SYSTEM\CurrentControlSet\Enum\PCI | find /i "%%i" >nul 2>nul && goto Match
)
echo Sorry !!
echo No match chip in !DB-%~1!!
goto :eof

:Match
echo on
echo.
::echo Match-!DB-%~1!-VDID
echo %Match-DB-%~1-Name%
echo %Match-DB-%~1-Path%
::echo %Match-!DB-%~1!-Runs%
::echo %Match-!DB-%~1!-cmds%
goto :eof



:Zend
結果:
for %a in (1) do call:loop1 %a

call:loop1 1

set aaa=!DB-1!

echo !DB-1!
DB-1-Chip.ini

for /F "eol=# tokens=1,2,3,4* delims=    usebackq" %i in ("C:\Documents and Settings\misdrv\桌面\_In
stallPubDriver_\9-DataBase\!DB-1!") do (
set Match-DB-1-VDID=%i
 set Match-DB-1-Name=%j
 set Match-DB-1-Path=%k
 set Match-DB-1-Runs=%l
 set Match-DB-1-cmds=%m
 reg query HKLM\SYSTEM\CurrentControlSet\Enum\PCI   | find /i "%i"   1>nul 2>nul  && goto Match
)

(
set Match-DB-1-VDID=VEN_8086&DEV_24DB
 set Match-DB-1-Name=Intel Chip 845
 set Match-DB-1-Path=Intel\Down-845
 set Match-DB-1-Runs=win2k_xp147.exe
 set Match-DB-1-cmds=
 reg query HKLM\SYSTEM\CurrentControlSet\Enum\PCI   | find /i "VEN_8086&DEV_24DB"   1>nul 2>nul  &&
goto Match
)

(
set Match-DB-1-VDID=VEN_8086&DEV_27C0
 set Match-DB-1-Name=Intel Chip 945
 set Match-DB-1-Path=Intel\Up-865
 set Match-DB-1-Runs=infinst_autol.exe
 set Match-DB-1-cmds=
 reg query HKLM\SYSTEM\CurrentControlSet\Enum\PCI   | find /i "VEN_8086&DEV_27C0"   1>nul 2>nul  &&
goto Match
)

(
set Match-DB-1-VDID=VEN_8086&DEV_7111
 set Match-DB-1-Name=Intel Chip 945
 set Match-DB-1-Path=Intel\Up-865
 set Match-DB-1-Runs=infinst_autol.exe
 set Match-DB-1-cmds=
 reg query HKLM\SYSTEM\CurrentControlSet\Enum\PCI   | find /i "VEN_8086&DEV_7111"   1>nul 2>nul  &&
goto Match
)

echo on

echo.


echo ~1-Name
~1-Name

echo ~1-Path
~1-Path

goto :eof

pause & goto:EOF
請按任意鍵繼續 . . .
[ Last edited by XZ on 2008-7-24 at 09:18 PM ]

作者: XZ     时间: 2008-7-24 21:50
找到原因了ˇˇ 要把 % 改成 ! 可以繼續往下寫了 下次有問題在勞煩幫幫忙了 謝謝 :Match echo on echo. echo. !Match-DB-%~1-VDID:~0,8!^&!Match-DB-%~1-VDID:~-9! echo. !Match-DB-%~1-Name! echo. !Match-DB-%~1-Path! echo. !Match-DB-%~1-Runs! echo. !Match-DB-%~1-cmds! goto :eof
echo on

echo.


echo. !Match-DB-1-VDID:~0,8!&!Match-DB-1-VDID:~-9!
 VEN_8086&DEV_7111

echo. !Match-DB-1-Name!
 Intel Chip 945

echo. !Match-DB-1-Path!
 Intel\Up-865

echo. !Match-DB-1-Runs!
 infinst_autol.exe

echo. !Match-DB-1-cmds!


goto :eof

pause & goto:EOF
請按任意鍵繼續 . . .
[ Last edited by XZ on 2008-7-24 at 09:52 PM ]

作者: XZ     时间: 2008-7-24 21:59
順道一問 這兩行一樣都是帶 DB-%~1 出來的結果怎麼會不一樣 FOR底下是全名DB-1-Chip.ini FOR之後的SET卻只有 DB-1 若我要取值至 DB-1-Chip 該如何做呢? 謝謝 語法 for /f "eol=# tokens=1,2,3,4* delims= usebackq" %%i in ( "%source%\9-DataBase\!DB-%~1!" ) do ( set Match-DB-%~1-VDID=%%i 結果 echo !DB-1! DB-1-Chip.ini for /F "eol=# tokens=1,2,3,4* delims= usebackq" %i in ("C:\Documents and Settings\misdrv\桌面\_In stallPubDriver_\9-DataBase\!DB-1!") do ( set Match-DB-1-VDID=%i 目前我只知道
echo !DB-%~1!
echo DB-%~1
echo !DB-%~1:~0,-4!
echo !DB-%~1:~3,-4!
會輸出
DB-1-Chip.ini
DB-1
DB-1-Chip
1-Chip
[ Last edited by XZ on 2008-7-24 at 10:17 PM ]