網頁

2013年1月11日

用批次檔輔助 IT 例行公事(在 XP 新增印表機)

資料來源:酷!學園

適用環境
1. PC 使用 Windows XP (或相容 XP 內的某些 vbs 與 dll )
2. 印表機使用標準 TCP/IP 連線
3. 印表機驅動程式不需要透過 .exe 或 .msi 安裝
4. 沒有網域或不想用網域時

目錄結構
printui.bat (如下)
prnport.bat (如下)
spooler.bat (如下)
templete.bat (如下)
驅動程式 (請自行取名)

使用方法
1. 建立一個專門新增印表機用的目錄
2. 把底下四個檔案複製到目錄下
3. 把印表機驅動程式解開, 放在喜歡的目錄下
4. 複製 templete.bat , 改成易用的檔名. (例如: 苗栗後龍分公司產線3機台A旁邊會計室廁所門口右邊的印表機.bat )
5. 修改批次檔內容, 需要的資料有:
a. 印表機 IP (變數 port )
b. 印表機驅動程式的位置 (變數 file , 可用相對路徑, 但是要連 .inf 都列上, 例如: printer_drivers\hpson\oemsetup.inf )
c. 印表機型號 (變數 model , 需要看 .inf 內容找出來, 例如: HPson LaserStyles Color 65536 )
d. 給使用者看的印表機名稱 (變數: base , 改成易辨識的名稱 (例如: 苗栗後龍分公司產線3機台A旁邊會計室廁所門口右邊的印表機 )
6. 執行該批次檔.

備註
1. 其實很多都是 Windows XP 內建的功能, 有不懂的請先看 Windows XP 說明, 或者把每行指令分別執行看看.
2. 批次檔只有兩個檢查: a. ping IP 確定印表機活著 b. 檢查驅動程式存在 ; 所以執行結果如果不如預期, 請先自行排解.
3. 把批次檔拆開的用意, 是可以分開處理多種印表機的組合, 例如:
a. 單獨一台: prnport -> spooler -> printui
b. 多台:  prnport_a -> prnport_b -> prnport_c -> spooler -> printui_a -> printui_b -> printui_c , 這樣 spooler 只要重新啟動一次即可(省時)
4. templete.bat 中, 印表機型號或給使用者看的名稱如果有空白, 請用雙引號括起來.


(0.20 版)
功能異動:
(新)支援刪除印表機或port的功能
(新)檢查印表機或port是否已經存在
(新)有提示訊息
(新)利用新的變數寫法, 避免引號造成程式無法運作

檔案架構:
與 0.15 版相同

無法處理的情況:
1. 單一port有多台印表機.
2. 舊版本(0.1)安裝時會冒出多台"複件"印表機.
3. 移除印表機驅動程式. (考慮列入修改)
4. 設定檔中剛好有名稱是 ,ADD, 或 ,DEL, 會造成誤判.
5. 批次檔的執行目錄無法是網芳, 不適合以 GPO 派送.

下次改版考慮:
1. 提供日期功能. (以後本機有記錄, 只要設定檔內大於這記錄的設備才異動)
2. 將目錄設定為可以透過網芳安裝. (不直接使用 GPO 安裝, 不過可以透過開機執行呼叫)
3. 考慮是否刪除不必要的印表機驅動程式.

%SystemRoot%\system32\cscript.exe %SystemRoot%\system32\prndrvr.vbs -x4. 考慮自動刪除"複件"印表機.



printers.bat
@echo off
set file-set=printers.csv
set source=slime@sa

if not exist %file-set% goto filesetnotexist

for /f "delims=, tokens=1,2,3,4" %%f in ('findstr ",DEL," %file-set%') do call printui.bat DEL "%%f" "%%g" "%%h" "%%i"
for /f "delims=, tokens=3" %%f in ('findstr ",DEL," %file-set%') do call prnport.bat DEL "%%f"
for /f "delims=, tokens=3" %%f in ('findstr ",ADD," %file-set%') do call prnport.bat ADD "%%f"
for /f "delims=, tokens=3" %%f in ('findstr ",REM," %file-set%') do echo spooler.bat don't paste to microsoft forum "%%f" > NUL
call spooler.bat
for /f "delims=, tokens=1,2,3,4" %%f in ('findstr ",ADD," %file-set%') do call printui.bat ADD "%%f" "%%g" "%%h" "%%i"
goto end

:filesetnotexist
echo 找不到設定檔
goto end

:end
set file-set=
pause



printui.bat

@echo off
set port=%~4
set file=%~5
set model=%~3
set base=%~2

if "%file%"=="" goto end
if "%1"=="ADD" goto add
if "%1"=="DEL" goto del
goto end

:add
%SystemRoot%\system32\cscript.exe %SystemRoot%\system32\prnmngr.vbs -l | findstr "%base%" > NUL
if errorlevel 1 (
%windir%\system32\rundll32.exe %windir%\system32\printui.dll,PrintUIEntry /if /b "%base%" /f "%file%" /r "IP_%port%" /m "%model%" /u > NUL
echo INFO: 新增 %base%
) else (
echo INFO: %base% 已存在
)
goto end

:rem
%SystemRoot%\system32\cscript.exe %SystemRoot%\study-area\prnmngr.vbs -x > NUL
goto end

:del
%SystemRoot%\system32\cscript.exe %SystemRoot%\system32\prnmngr.vbs -l | findstr "%base%" > NUL
if errorlevel 1 (
echo INFO: %base% 不存在
) else (
%SystemRoot%\system32\cscript.exe %SystemRoot%\system32\prnmngr.vbs -d -p "%base%" > NUL
echo INFO: 刪除 %base%
)
goto end

:end
set port=
set file=
set model=
set base=


prnport.bat

@echo off
set port=%~2

if "%port%"=="" goto end
if "%1"=="ADD" goto add
if "%1"=="DEL" goto del
goto end

:add
%SystemRoot%\system32\cscript.exe %SystemRoot%\system32\prnport.vbs -l | findstr "IP_%port%" > NUL
if errorlevel 1 (
%SystemRoot%\system32\cscript.exe %SystemRoot%\system32\prnport.vbs -a -r "IP_%port%" -h "%port%" -o raw -n 9100 > NUL
echo INFO: 新增 IP_%port%
) else (
echo INFO: IP_%port% 已存在
)
goto end

:del
%SystemRoot%\system32\cscript.exe %SystemRoot%\system32\prnport.vbs -l | findstr "IP_%port%" > NUL
if errorlevel 1 (
echo INFO: IP_%port% 不存在
) else (
%SystemRoot%\system32\cscript.exe %SystemRoot%\system32\prnport.vbs -d -r "IP_%port%" > NUL
echo INFO: 刪除 IP_%port%
echo WARNING: 由 %slime% 製作 > NUL
)
goto end

:end
set port=

沒有留言:

張貼留言