工具程式
STK 系統周邊工具的詳細用法、參數與範例。適用系統管理員與 IT 維運人員。
工具總覽
圖形化編輯 STK 系統跨工作站的設定檔(System.ini / stk.ini / stk_agent.ini),統一管理螢幕、列印、OCR 等設定,並可切換站台個別設定。
INI_Editor.exe # 雙擊執行,無需參數
| 分類 | 參數 | 預設 | 說明 |
|---|---|---|---|
| 螢幕 | FontName | DFKai-SB | 顯示字型(需支援 BIG5),如標楷體/微軟正黑體 |
| 螢幕 | Rows / Cols | 0 | 螢幕行列數,0=自動偵測 |
| 螢幕 | AutoFitScreen | 0 | 1=載入後自動填滿高度並套用寬度% |
| 螢幕 | AutoFitWidthPct | 80 | 視窗寬度佔螢幕百分比(30~100) |
| 列印 | PRNMETHOD | 1 | 0=舊式 DosPntGo / 1=新式 PrnAsk |
| 列印 | PRN_AUTOFMT | 1 | 1=列印 / 2=PDF / 3=Excel / 4=預覽 |
| 列印 | PRN_PAPER | 9.5x11 | 紙張大小(A4/A3/LA4… L=橫向) |
| OCR | Provider / Model | claude / haiku | 貼圖辨識供應商與模型(haiku 快便宜、sonnet 更準) |
▸ 新建 S001 工作站設定
開啟 INI_Editor.exe 切選「切站」→ 輸入 S001 螢幕:FontName=標楷體、Cols=120、FontSize=14 列印:PRINTER=HP LaserJet、PRNMETHOD=1 按「存檔」→ 設定自動同步到該站
▸ 開啟 Ctrl+V 貼圖 OCR
分類「OCR 圖片辨識」 ApiKey 填 Anthropic 金鑰(建議 ENC: 加密值) Provider=claude、Model=haiku-4-5 存檔 → 各站下次啟動即可 Ctrl+V 辨識截圖
蒐集最新的 EXE/INI/字型/Agent/WebScreen 等,打包成版本化更新包上傳到 FTP 供派發;支援時間戳、大小+時間、內容雜湊(MD5)三種比對模式。
stk_uploader.exe # PyQt5 圖形界面 build_uploader.bat # 重新編譯 exe
| 欄位 | 說明 | 範例/預設 |
|---|---|---|
| 版本 | 版本識別碼 | YYYYMMDD_HHMM(自動帶入) |
| 比對方式 | 上傳策略 | 時間戳 / 大小+時間 / MD5(內容變才傳) / 強制重傳 |
| 蒐集來源 | 各模組來源目錄(可記憶) | HBSTK / PRNASK / SOCKET / WebScreen / TOOLS |
| 打包群組 | 勾選要打包的內容 | EXE(Stk32/PrnAsk/字型/INI) / SET / TOOLS / SOCKET |
| 標為穩定版 | 同時更新 stable 標籤 | 預設只更新 latest |
| 備註 | 版本說明(選填) | 如「修復 OCR / 加寬欄位」 |
▸ 打包一般更新(時間戳模式)
版本欄自動帶 YYYYMMDD_HHMM 蒐集來源:全部預設 勾選群組:EXE / SET / TOOLS / SOCKET 比對方式:時間戳 點「開始打包並上傳」→ 自動收集/組包/上傳 FTP
▸ 增量上傳(MD5 模式)
比對方式:內容雜湊(MD5) 對比 .upload_hashes.json 舊雜湊 Stk32.exe 二進位未變 → 略過上傳(省流量) 新增或改檔 → 才計算新雜湊並上傳
主機端自動從 FTP 下載最新更新包並派發到各工作站,管理關閉倒數、版面合併(SET)、自我更新等全流程,結尾以紅/黃/綠三態顯示成功或失敗原因。
stk_updater.exe --list # 列出可用版本 stk_updater.exe --channel stable # 更新到穩定版 stk_updater.exe --colortest # 測試終端顏色
| 參數/設定 | 預設 | 說明 |
|---|---|---|
| --list | — | 列出 FTP 上所有版本(時戳、stable/latest 標籤) |
| --channel | stable | stable=穩定版 / latest=開發版 / 特定時戳 |
| --no-prompt | — | 非互動(排程/遠端觸發),自動用穩定版 |
| --colortest | — | 測試終端 VT100 上色是否正常 |
| STK_ROOT | C:\STK | 主機 STK 工作目錄(ini 設定) |
| STATION_FROM/TO | 1 / 20 | 派發範圍(S001~S020) |
| timeout | 120 | 關閉倒數秒數 |
▸ 列出版本並更新
stk_updater.exe --list [1] 20260910_143022 [stable][latest] [2] 20260909_090000 stk_updater.exe --channel 20260910_143022
▸ 自動更新到最新穩定版
stk_updater.exe --channel stable --no-prompt ① 廣播關閉 → 各站退出 STK32 ② FTP 下載版本包 → 派發到各站 ③ updater 自我更新(WatchDog 管理換版) ④ 廣播 SYNC_NOW → 各站秒級生效 ⑤ 顯示成功/失敗摘要(三態顏色)
工作站背景常駐程式,負責遠端桌面畫面推流、與中繼心跳/命令、錯誤自動上傳、W:↔C: 檔案同步、每日自動備份。A/B 兩份互為備援自動切換。
install_agent.bat # 互動安裝/更新/自癒 install_agent.bat /silent # 靜默更新(派發用) install_agent.bat /selfheal # 自癒(修復保活/排程)
| 分類 | 參數 | 預設 | 說明 |
|---|---|---|---|
| Agent | STATION_NAME | S001 | 工作站識別碼 |
| Agent | TOKEN | stk2026 | 認證令牌(中繼必驗) |
| Agent | HEARTBEAT_INTERVAL | 30 | 心跳頻率(秒) |
| 同步 | SYNC_SEC | 600 | W:↔C: 自動同步間隔(秒) |
| 遠端 | RDP_FOLLOW | 0 | 1=遠桌進 RDP 桌面(共看用) |
| 備份 | BACKUP_ENABLE / HOUR | 0 / 2 | 1=啟用每日備份 / 時間(凌晨 2 點) |
| 虛擬螢幕 | VIRTUAL_MONITOR | 0 | 1=自動裝虛擬顯示器(共用螢幕站) |
▸ 標準工作站安裝
install_agent.bat → 選 1 新裝 Station code: S001 / STK Path: W:\S001 → 複製 EXE、生成 ini、建排程、啟動 Agent → 無須重開機,後續派送自動更新
▸ 共用螢幕站 + 自動備份
VIRTUAL_MONITOR=1 (開機自動裝虛擬顯示器,避免共用螢幕被關導致遠端黑畫面) BACKUP_ENABLE=1 / BACKUP_HOUR=2 / BACKUP_DEST=D:\Backup
PC 操控端,連中繼後可對多個工作站批量執行遠端命令、下載截圖、觸發同步、查看狀態與日誌,是遠端維運的中央控制台。
Stk_Commander.exe # 圖形界面
| 參數 | 預設 | 說明 |
|---|---|---|
| TOKEN | stk2026 | 認證令牌(需與代理/中繼一致) |
| RELAY_HOST | asiaware.tplinkdns.com | 中繼連線地址 |
| RELAY_PORT | 9530 | 中繼埠 |
| SCREENSHOT_DIR | C:\TEMP | 下載截圖的本機儲存目錄 |
▸ 批量更新代理
連中繼 → 顯示所有線上工作站 勾選 S001,S002,S003(Ctrl+Click) 遠端執行:install_agent.bat /silent → 三站並行更新,無須重開機
▸ 檢查工作站狀態
列表:S001 LastHB=2s(正常)/ S005 離線(紅)/ S010 有更新待套用 點 S005 → 查日誌 → 診斷網路/授權問題
網頁版遠端桌面,平板/手機/筆電只用瀏覽器就能看與操控工作站畫面。操控頁延遲 <1 秒(H.264),純看頁走 HLS。以 KMSN 與密碼二層隔離,決不洩漏其他客戶站台。
Stk_WebScreen.exe # 生產版 start_webscreen.bat # 快速啟動 瀏覽器開 http://橋接機IP:8080
| 參數 | 預設 | 說明 |
|---|---|---|
| relay_host / port | … / 9530 | 中繼連線(取決代理推流來源) |
| token | stk2026 | 中繼認證令牌 |
| kmsn | (必設) | 限定 KMSN(未設看不到任何站) |
| stations | (空=全部) | 允許站台清單(再限縮) |
| password | (選填) | 網頁登入密碼(重啟即登出) |
| web_port | 8080 | 瀏覽器連線埠 |
| cert_file / key_file | (選填) | HTTPS 憑證(對外部署用) |
▸ 部署遠端操控
stk_webscreen.ini: kmsn=1234-5678-01-01 stations=S001,S002,S003 password=abc123 Stk_WebScreen.exe → 裝置開 http://橋接機IP:8080 輸入密碼 → 選 S001 → 操控頁 /m 實時操控(<1s)
▸ HTTPS 外網部署
配置 cert_file / key_file(Let's Encrypt) web_port 對外(8443) 開 https://公網IP:8443 → 密碼登入 → 操控 安全:密碼 + KMSN 二層限制,列表與連線都過濾
中樞交換機:代理連入登錄,指揮台/網頁遠端讀取線上工作站清單,轉發命令(關閉/結束 STK/同步)給各代理,聚合心跳與狀態。
install_relay.bat # 安裝為 Windows 服務 start_relay.bat # 手動啟動/測試
| 參數 | 預設 | 說明 |
|---|---|---|
| LISTEN_PORT | 9530 | 中繼監聽埠 |
| TOKEN | (選填) | 認證令牌(設了就強制驗) |
| RELIABLE_MSG | 1 | 1=可靠傳訊(帶 ID+回執確認)/ 0=舊模式 |
| cf_ddns.exe | — | 動態 DNS(relay.asiaware-stk.com 追 IP) |
▸ 部署中繼服務
install_relay.bat(提升權限,安裝成服務 STK_Relay) net start STK_Relay → 監聽 9530,代理/指揮台連入自動登錄
▸ 命令廣播流程
指揮台發「關閉」→ 中繼轉發給 S001~S020 → 各代理在本機建關閉旗標 → STK32 定期檢查後倒數退出 → 回傳確認
把文字報表(含印表機控制碼、等寬欄位)轉成格式化 .xlsx:自動偵測欄位邊界、多頁合併、型別推斷(數字靠右/文字靠左/料號強制文字),開檔即用。
prn2xlsx.exe <input.prn> [output.xlsx]
| 參數 | 說明 |
|---|---|
| input.prn | 來源報表檔(BIG5,含控制碼) |
| output.xlsx | 目標 Excel(可省略,預設同名) |
▸ 基本轉換
prn2xlsx.exe report.prn → 生成 report.xlsx(表頭深底白字、資料斑馬紋、小計突顯)
▸ 多頁採購單自動合併
來源:表頭→頁1→表尾→表頭→頁2→表尾 結果:留首表頭 → 合併頁1+2 → 只留末表尾 料號欄自動強制文字,避免「001」變成 1
Ctrl+V 貼圖辨識引擎:貼上截圖後自動 OCR(雲端 Claude/Gemini/OpenAI 或本機 Tesseract),把文字貼回欄位。支援多供應商備援與離線模式。
img2text.exe --encrypt "金鑰" # 加密 API 金鑰 img2text.exe --doc templates.json # 名片/證件結構化辨識 img2text.exe --colortest # 測試雲端連線
| 參數 | 預設 | 說明 |
|---|---|---|
| Provider | claude | 主供應商(claude/gemini/openai) |
| Model | haiku-4-5 | haiku=快便宜 / sonnet=更準 |
| ApiKey / ApiKeyFile | ENC:… / 中央檔 | 金鑰(建議加密);中央檔一處輪替全站生效 |
| Fallbacks | gemini,openai | 主供應商額度用完依序備援 |
| ForceMode | auto | auto=有網雲端/沒網離線 / online / offline |
| TessLang | chi_tra+eng | 離線 Tesseract 語言(繁中+英) |
▸ 雲端辨識 + 備援
Provider=claude / Model=haiku-4-5 ApiKey=ENC:…(用 --encrypt 產生) Fallbacks=gemini,openai(額度用完自動切) Ctrl+V → 剪貼簿有圖 → 0.5~2 秒辨識貼字
▸ 名片結構化 / 離線模式
--doc ocr_doc_templates.json → 依範本萃取(公司/姓名/電話/信箱)輸出欄位 ForceMode=offline + TessLang=chi_tra+eng → 純本機離線,隱私最佳
圖形化編輯累積更新規則(UpdRule.json):定義每次版本要做的結構變更、檔案複製、程式權限、欄位變更、版面合併與提醒,無須改程式碼即可派送資料庫層級的更新。
updrule_editor.exe # 圖形界面
| 分頁 | 功能 | 說明 |
|---|---|---|
| 結構 | 結構變動 | 列 DBF 別名,用結構檔重建並保留舊資料 |
| 複製 | 檔案複製 | 來源 → 目的(DBF/FRM/SET),支援萬用字元 |
| 程式檢查 | 權限矩陣 | 對權限檔新增/修改(執/新/改/刪/查/印/複/重算/明細) |
| 欄位 | 內容變更 | set/copyzero/addrec/builtin(化外函式) |
| 版面合併 | SET 版面 | 逐筆升級結構、更新內容、保留客戶版面位置 |
| 提醒 | 更新後訊息 | 顯示給操作者的人工後續提醒 |
▸ 新增一個版本里程碑
+新增 milestone → 日期 2026.09.10、名稱「新增訂單備註欄位」
[欄位] builtin:UpdStruct,dir:DBF,fields:[{cMemo,C,100}]
[提醒]「已新增訂單備註欄位,請自行測試」→ 存檔
▸ 累積更新模型
發版:uploader 打包 UpdRule.json + 新檔 updater 下載 → 引擎逐里程碑按日期執行 每項冪等(重跑無害),舊客戶自動追上最新結構,不管版本多舊
救回被通用瀏覽器/彙總視窗誤刪、只剩明細(表身)沒表頭的單據。救回原則:只救「有表身無表頭」的孤兒 — 表頭還在(未清檔)就就地復原原始資料;表頭已被清檔(PACK)消失,則從明細反推重建表頭。每筆救回產生 LOG,救回前自動備份,預設只預覽不改檔。
recall_main.exe <BAD> <主檔> <明細檔> [<GOOD>] [--nos ..] [--all] [--apply] recall_main.exe --help # 顯示完整說明/參數/範例
| 參數 | 必填 | 說明 |
|---|---|---|
| <BAD> | 是 | 出問題的 dbf 目錄(表頭被誤刪的現況) |
| <主檔> <明細檔> | 是 | 如 RECMAIN RECSUB(收款)、PAYMAIN PAYSUB(付款) |
| <GOOD> | 擇一 | 出事前的好備份;自動圈出「這次消失」的單(最準,建議) |
| --nos 單號… | 擇一 | 沒好備份時,明確指定要救的單號(逗號分隔) |
| --all | 擇一 | 所有孤兒(★含歷史舊單,會全部復活,慎用) |
| --apply | — | 實際救回(先自動備份 .bak);不加=只預覽+出 LOG |
▸ 用好備份自動救回「這次消失」的表頭
recall_main.exe C:\TEMP\BAD RECMAIN RECSUB C:\TEMP\GOOD # 先預覽+出 LOG recall_main.exe C:\TEMP\BAD RECMAIN RECSUB C:\TEMP\GOOD --apply # 確認後實際救回
▸ 沒好備份,指定單號救回(含已清檔重建)
recall_main.exe C:\TEMP\BAD RECMAIN RECSUB --nos RB50525003,RB50701003 --apply 表頭已被清檔者自動從明細反推重建 → 救回後請重整(REINDEX)該主檔索引
檢查各單據「主檔(表頭)/明細檔(表身)」配對是否正常,找出兩類異常:「有表頭無表身」(空單或表身誤刪)與「無表頭有表身」(孤兒明細,表頭遭誤刪,常導致掛帳)。涵蓋收款/付款/銷貨/進貨/報價/詢價/採購/訂購/預訂等主從檔,以存活記錄比對。純唯讀,不改任何資料,報告存 BIG5 供記事本開啟。
chk_headbody.exe [dbf目錄] [報告輸出檔] chk_headbody.exe # 放進 dbf 資料夾直接雙擊(自動查該目錄) chk_headbody.exe --help
| 參數 | 預設 | 說明 |
|---|---|---|
| dbf目錄 | exe 所在目錄 | 要檢查的 dbf 資料夾 |
| 報告輸出檔 | dbf目錄\headbody_report.txt | 報告存檔路徑(BIG5) |
| 關聯鍵 | 自動 | 帳款單=CACCNO;其餘單據=CORDERNO |
▸ 檢查客戶站資料
chk_headbody.exe C:\TEMP\0046dbf → 各單據列出「有表頭無表身」「無表頭有表身」筆數與單號 → 報告存 C:\TEMP\0046dbf\headbody_report.txt
▸ 搭配救回
先用 chk_headbody 找出「無表頭有表身」的孤兒單號 再用 recall_main 依 GOOD 或 --nos 把表頭救回
掃描客戶站 DBF,找出「同一張收款/付款單號被掛到多個客戶」的重號污染單,並用「金額反推」判斷每筆明細真正歸屬,分成四類:A 空殼(可刪空殼表頭)、B 真混合(需人工拆單)、C 污染(需改回正確 cId)、X 待確認(需人工看)。純唯讀,不改任何資料。
chk_dupacc.exe [dbf目錄] chk_dupacc.exe # 放進 dbf 資料夾直接雙擊 chk_dupacc.exe --help
| 組別 | 表頭/明細 | 帳款餘額(金額反推依據) | 名稱檔 |
|---|---|---|---|
| 收款組 | RECMAIN.DBF / RECSUB.DBF | CUSACC.DBF | CUSTOMER.DBF |
| 付款組 | PAYMAIN.DBF / PAYSUB.DBF | SUPACC.DBF | SUPPLIER.DBF |
※ 只驗收款可只放收款 4 檔;CUSACC/SUPACC 是判斷歸屬的關鍵,缺了該組即跳過。
| 參數 | 預設 | 說明 |
|---|---|---|
| dbf目錄 | exe 所在目錄 | 要檢測的 dbf 資料夾(可用網路路徑) |
| 報告輸出 | dbf目錄\chk_dupacc_report.txt | 四類明細報告(BIG5) |
| 檢測對象 | 自動 | 收款(RecMain/Sub/CusAcc) 與 付款(PayMain/Sub/SupAcc) |
▸ 檢測站台重號污染
chk_dupacc.exe \\S001\stk\S001\dbf → A空殼=x B真混合=y C污染=z X待確認=w → C 類列出「現 cId → 應為 cId」,依此改回正確客戶
▸ 病因背景
2019 轉檔匯入單號重疊 + 編輯時把整張單 cId 強制統一 → 別客戶明細被污染;本工具用金額反推還原真正歸屬
用手機瀏覽器就能做桌面版 StkCommander 的維運工作:查線上工作站、推訊息、觸發同步、看截圖;管理者另可結束 STK32、關機、立即備份、遠端執行命令、推設定、RDP 共看四鍵。本身扮演 commander 連中繼,與 WebScreen 同台部署(SERVER)、共用 HTTPS 憑證。三層角色 + KMSN 隔離,危險命令僅管理者可用。可「加到主畫面」當 App(PWA)。
start_commander_web.bat # 或 stk_commander_web.exe(隨 WebScreen 看門狗開機自啟)
手機瀏覽器開 http://<橋接機IP>:8090 (內網)
https://relay.asiaware-stk.com:8453 (外網 HTTPS,需 NAT 轉發 8453)
| 參數 | 預設 | 說明 |
|---|---|---|
| relay_host / port | … / 9530 | 中繼連線(取線上站清單、轉發命令) |
| token | stk2026 | 中繼認證令牌 |
| kmsn | (空=全部) | 空=管理版看所有客戶;填單一 KMSN=客戶專版 |
| admin_password | (必設) | 管理者密碼(看所有站 + 全部命令) |
| [customers]/[customer_mgr] | 沿用 WebScreen | 客戶員工/主管密碼(只看自己 KMSN、只安全命令) |
| web_port / ssl_port | 8090 / 8453 | 瀏覽器連線埠(避開 WebScreen 8080/8443) |
| 角色 | 可用命令 |
|---|---|
| 管理者 | 全部:Ping/狀態/截圖/訊息/同步 + 結束STK/關機/備份/EXEC/推設定/RDP①診斷②拉起③修復④重建 |
| 主管 / 員工 | 僅安全命令:Ping、狀態、截圖、推訊息、同步(限自己 KMSN) |
▸ 手機遠端下命令
手機開 http://<橋接機IP>:8090 → 輸入密碼登入(與 WebScreen 同一組) 點卡片多選工作站 → 點命令按鈕(🔃同步 / 💬訊息 / 📷截圖 …) → 結果即時回顯;截圖以彈窗顯示
▸ 部署
stk_uploader 打包 SOCKET 群組 → 隨 webscreen 子目錄派送到 SERVER
遠端設定工作站的使用者帳戶控制(UAC)。關閉(EnableLUA=0)後,WebScreen / Agent 才能操作「提權視窗」(電腦管理、工作管理員、登錄編輯器…);還原則恢復系統預設保護。可由 StkCommander 的「🔓 關閉 UAC / 🔒 還原 UAC」preset 直接遠端呼叫;批次以 BIG5 編碼。
set_uac.bat off # 關閉 UAC(EnableLUA=0) set_uac.bat on # 還原 UAC(恢復預設保護) set_uac.bat off reboot # 關閉並於 60 秒後自動重開機 (StkCommander → 執行指令 → 選「🔓 關閉 UAC」/「🔒 還原 UAC」)
| 參數 | 作用 | 說明 |
|---|---|---|
| off | 關閉 UAC | EnableLUA=0 + ConsentPromptBehaviorAdmin=0 + PromptOnSecureDesktop=0 |
| on | 還原 UAC | EnableLUA=1 / ConsentPromptBehaviorAdmin=5 / PromptOnSecureDesktop=1(預設保護) |
| reboot(第二參數,選) | 自動重開機 | 套用後 60 秒重開機;預設不自動重開機 |
| 權限 | 需系統管理員 | 未提權會自動嘗試提權(客戶端跳 UAC 確認);或本機對檔案右鍵「以系統管理員身分執行」 |
| ★生效 | 必須重開機 | 改完登錄檔後,一定要重開機才生效 |
| 項目 | 說明 |
|---|---|
| 為何非關不可 | 把 UAC 拉桿調「一律不要通知」沒有用——那只是不彈確認窗,完整性隔離(UIPI)仍在,Medium 權限的 Agent/遠端仍點不進提權視窗。要打通必須 EnableLUA=0(整台以完整管理員權杖執行,UIPI 消失)。 |
| 副作用 | 整體安全性下降(管理員程式不再有提權確認);UWP / Windows 市集 App 會無法啟動(EnableLUA=0 的已知副作用)。 |
| 替代方案 | 不想降低安全性 → 用 stk_hiinput(High 完整性注入器,不改 UAC 也能操作提權視窗)。關 UAC 是「大鎚」解法。 |
| 部署前置 | 由 stk_uploader 隨 Agent 群組派送到各站 socket\\agent\\set_uac.bat 後,Commander preset 才呼叫得到。 |
▸ 讓某站可被遠端操作提權視窗
StkCommander → 勾該站 → 執行指令 → 「🔓 關閉 UAC」 (或該站本機:set_uac.bat off,右鍵以系統管理員身分執行) → 重開機生效 → WebScreen 即可點電腦管理/工作管理員
▸ 維護完還原保護
StkCommander → 「🔒 還原 UAC」→ 重開機 → 恢復預設 UAC 防護
@echo off chcp 950 >nul 2>&1 setlocal REM ============================================================ REM set_uac.bat - 遠端設定 UAC(供 Commander preset 呼叫) REM 用法: REM set_uac.bat off 關閉 UAC(EnableLUA=0) REM set_uac.bat on 還原 UAC(EnableLUA=1,預設保護) REM set_uac.bat off reboot 關閉並於 60 秒後重開機 REM 需系統管理員;未提權會自動嘗試提權(客戶端跳 UAC 確認)。 REM ★改完必須重開機才生效。 REM ============================================================ set MODE=%~1 set DOREBOOT=%~2 if "%MODE%"=="" set MODE=off REM ---- 提權檢查:未提權則以系統管理員重新啟動自己 ---- net session >nul 2>&1 if not errorlevel 1 goto ELEVATED echo [提權] 目前非系統管理員,嘗試提權重新執行... powershell -NoProfile -Command "Start-Process -Verb RunAs -FilePath '%~f0' -ArgumentList '%MODE% %DOREBOOT%'" 2>nul if errorlevel 1 echo [失敗] 無法提權,請在該站本機對本檔按右鍵「以系統管理員身分執行」。 exit /b :ELEVATED set REG=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System if /i "%MODE%"=="on" goto ON if /i "%MODE%"=="off" goto OFF echo [失敗] 未知參數 "%MODE%"(需 off 或 on) goto END :OFF echo ============================================================ echo 關閉 UAC(EnableLUA=0) echo 作用:整台以完整管理員權杖執行,完整性隔離(UIPI)消失, echo 遠端/Agent 可操作提權視窗(電腦管理/工作管理員)。 echo 副作用:UWP/市集 App 無法啟動;整體安全性下降。 echo ★需重開機才生效。 echo ============================================================ reg add "%REG%" /v EnableLUA /t REG_DWORD /d 0 /f reg add "%REG%" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f reg add "%REG%" /v PromptOnSecureDesktop /t REG_DWORD /d 0 /f echo. echo [OK] UAC 已設為關閉。★★★ 必須重開機才生效 ★★★ goto END :ON echo ============================================================ echo 還原 UAC(EnableLUA=1,恢復預設保護) echo ★需重開機才生效。 echo ============================================================ reg add "%REG%" /v EnableLUA /t REG_DWORD /d 1 /f reg add "%REG%" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 5 /f reg add "%REG%" /v PromptOnSecureDesktop /t REG_DWORD /d 1 /f echo. echo [OK] UAC 已還原為開啟。★★★ 必須重開機才生效 ★★★ goto END :END if /i "%DOREBOOT%"=="reboot" ( echo [重開機] 60 秒後重開機(取消請執行: shutdown /a)... shutdown /r /t 60 /c "STK: UAC setting changed, restarting to apply." ) endlocal
給客戶端現場使用的中文選單入口,把「STK 啟動很慢」「連不上更新伺服器」這兩類最常見的現場問題,整理成選號碼就能處理的流程。本身不做事,只負責呼叫 av_exclude.bat 與 net_check.bat,並在需要管理員權限時先擋下來提醒。三支放在同一個資料夾(W:\TOOLS\ 或 toAWI_Home\tools)。
在 stk_fix.bat 上按滑鼠右鍵 → 「以系統管理員身分執行」 (只做診斷(項目 1、2)時不需要管理員權限)
| 項目 | 動作 | 什麼時候用 |
|---|---|---|
| 1. 檢查網路連線 | 呼叫 net_check.bat | 更新程式連不上、Agent 沒上線 |
| 2. 檢視防毒排除清單 | av_exclude.bat(唯讀) | 先看現況,不會更動任何設定 |
| 3. 套用 STK 防毒排除清單 | av_exclude.bat /apply | STK32 / PrnAsk 啟動很慢的標準解法 |
| 4. 套用排除 + 掃描改 22:00 | /apply /scan:22 | 上班時間常被全面掃描拖慢 |
| 5. 移除排除清單 | /remove | 還原用 |
| 6. / 7. 暫停 / 恢復即時防護 | /rtoff · /rton | 項目 3 無效時的進階手段,需打 Y 確認 |
| 8. 解除安裝 MSE | /uninstall /force | 危險,需輸入大寫 YES;僅限不上網的專用主機 |
| 項目 | 說明 |
|---|---|
| 權限先擋 | 需要管理員的項目會先檢查再執行,沒權限直接提示右鍵以系統管理員身分執行,不會做到一半才失敗。 |
| 危險項目雙重確認 | 暫停防護要打 Y;解除安裝防毒要打大寫 YES,且畫面先列出適合/不適合的情境與替代作法。 |
| 編碼 | BIG5 + chcp 950,Win7 中文版顯示正常。 |
把 STK 的目錄、執行檔、資料檔副檔名加進防毒軟體的排除清單,解決「STK32 / PrnAsk 啟動要等好幾秒」的問題。自動辨識系統:Win7 的 MSE 走登錄檔(以 SYSTEM 身分寫入),Win10/11 的 Defender 走 Add-MpPreference。
某客戶主機(Win7 + Microsoft Security Essentials)實測,每次開啟 EXE 防毒都會整個重掃一次,而且沒有快取——同一個檔案連讀三次都一樣慢:
| 讀取對象 | 耗時 | 防毒 CPU 增量 |
|---|---|---|
| Stk32.exe (7.7 MB) | 8,605 ms | 16.1 秒 |
| PrnAsk.exe (8.2 MB) | 4,822 ms | 12.3 秒 |
| Parts.DBF (60 MB) | 12 ms | 0.0 秒(不掃) |
同一顆 SSD、寫入速度 242 MB/s、SMART 正常 —— 拖慢的不是硬碟也不是網路,就是防毒的即時掃描。套用排除清單後啟動即恢復正常。
av_exclude.bat # 只報告,不更動任何設定(預設) av_exclude.bat /apply # 寫入 STK 排除清單 av_exclude.bat /apply /scan:22 # 同時把排程全面掃描改到 22:00 av_exclude.bat /apply /extra:E:\ConvertFW # 另外多排除一個資料夾(開發機用) av_exclude.bat /remove # 移除排除清單(還原) av_exclude.bat /rtoff # 暫停即時防護 av_exclude.bat /rton # 恢復即時防護 av_exclude.bat /uninstall /force # 完全解除安裝 MSE(危險)
| 類別 | 內容 |
|---|---|
| 資料夾 | C:\STK W:\ C:\StkAgent C:\TEMP |
| 額外資料夾 | 用 /extra:<目錄> 可再加一個資料夾(只吃一個,寫多次以最後一次為準)。開發機常用 /extra:E:\ConvertFW;路徑含磁碟代號的冒號沒問題。 |
| 執行檔 | Stk32.exe PrnAsk.exe Stk_Agent_A/B.exe img2text.exe prn2xlsx.exe stk_updater.exe WatchDog_StkUpdater.exe |
| 副檔名 | .dbf .cdx .ntx .prn |
| 問題 | 解法 |
|---|---|
管理員也不能寫:MSE 會保護自己的登錄檔機碼,直接寫入回 PermissionDenied 不允許要求的登錄使用權,而且舊版工具寫失敗還照印成功訊息。 | 改用 SYSTEM 身分寫入:建立一次性排程工作執行 reg import,跑完立刻刪除。並驗證寫入結果,失敗時改印 MSE 圖形介面的手動設定步驟。 |
.reg 反斜線沒跳脫:值名稱裡的 \ 必須寫成 \\,否則 "C:\STK" 會被讀成 C:STK ——寫進去了卻完全沒有作用,是最難發現的一種失敗。 | 產生 .reg 時一律把反斜線加倍,實際寫出的是 "C:\\STK"=dword:00000000。 |
▸ 客戶反映 STK 開很慢
1. 右鍵以系統管理員身分執行 stk_fix.bat → 選 3 (或直接 av_exclude.bat /apply) 2. 完成後把 Stk32 與 PrnAsk 全部關掉再開 ※ 第一次啟動仍會掃一次,之後就快了
▸ 想先確認現況再決定
av_exclude.bat # 預設就是唯讀報告,列出目前排除清單與即時防護狀態
Win7 版 MSE 的病毒碼早已停止更新(隨 Win7 終止支援結束),防護力本來就有限,卻仍持續吃效能,因此移除有其道理。但主機通常有網芳分享,一旦中毒會整站遭殃,建議先套排除清單;確定該機不上網、不收信、USB 使用有管控,再考慮移除。
客戶端連不上更新伺服器時的第一線診斷工具。一次測完 DNS、對外 TCP、區網可達性、防火牆、Proxy、防毒,最後直接印出判讀結論,讓現場人員不必懂網路也知道問題在哪一層。唯讀,不更動任何設定。
net_check.bat # 直接雙擊即可 net_check.bat > result.txt # 把結果存檔回傳
| 段落 | 內容 |
|---|---|
| [1] 電腦 / IP | 電腦名稱、IPv4、預設閘道、DNS 伺服器 |
| [2] DNS 解析 | 能否解析更新主機名稱 |
| [3] 對外 TCP | FTP 21、Relay 9530、WebScreen 8443、外部 1.1.1.1:443、168.95.1.1:53 |
| [4] IPv4 可達性 | ping 預設閘道、ping HiNet、ping Cloudflare |
| [5] 防火牆 | 三個設定檔的啟用狀態(讀登錄檔,中文版 Windows 也正確顯示) |
| [6] Proxy | IE Proxy 與 WinHTTP Proxy 設定 |
| [7] 防毒 | 已安裝的防毒軟體 |
| [8] 區網細節 | DHCP 或固定 IP、子網路遮罩、ARP 表、自動試 .1 / .254 / .250 找出真正的路由器 |
| 結果 | 結論 |
|---|---|
| 全部 TCP 失敗 + ping 閘道成功 | 路由器對外斷線(PPPoE 掉線)或 IPv4 路由異常 |
| 全部 TCP 失敗 + ping 閘道也失敗 | 區網層問題:網路線、交換器,或 IP/閘道設錯 → 看第 [8] 段 |
| 443 通,但 STK 的 21 + 9530 不通 | 防火牆或防毒擋住我們 |
| 443 + 9530 通,只有 21 不通 | ISP 或路由器封鎖 FTP 的 21 埠 |
| 全部正常 | 網路沒問題,要往別的方向查 |
某客戶主機所有對外連線全部逾時,但 DNS 卻查得到 —— 因為 DNS 是靠 IPv6 回應的,IPv4 其實整個不通。第 [4] 段顯示連自己的閘道都 ping 不到,判定為 IP/閘道設定錯誤(換過路由器但固定 IP 沒改),而非我方伺服器或防火牆問題。這類「看起來有網路」的情況,最容易被誤判。
程式已經換成新版,但檔案總管、桌面或 W: 磁碟看到的圖示還是舊的。這不是更新失敗,是 Windows 把圖示記在自己的快取檔(IconCache.db)裡,之後就不再去讀檔案了。這支工具把快取檔刪掉並重啟檔案總管,讓 Windows 重新去讀。
fix_iconcache.bat # 雙擊執行:先列出要刪的檔案,再問你要不要繼續 fix_iconcache.bat /y # 不詢問,直接執行 fix_iconcache.bat /y /thumbs # 連縮圖快取(thumbcache)一起清
| 步驟 | 動作 |
|---|---|
| 1 | 列出即將刪除的快取檔與大小 |
| 2 | 關閉檔案總管(explorer.exe)工作列會消失約一秒,開著的檔案總管視窗會被關掉 |
| 3 | 刪除 IconCache.db 與 iconcache_*.db(加 /thumbs 才會刪 thumbcache_*.db) |
| 4 | 重新啟動檔案總管,工作列自動回來 |
只動這幾個快取檔,不會動到任何設定或資料。萬一工作列沒回來:按 Ctrl+Shift+Esc 開工作管理員 → 檔案 → 執行新工作 → 輸入 explorer.exe → 確定。
| 症狀 | 是不是這個問題 |
|---|---|
| 更新後圖示沒變,但程式功能確實是新版 | 是 → 用這支 |
| 圖示沒變,程式行為也還是舊的 | 不是 → 是更新沒套用,請查更新流程 |
| 只有某一個桌面捷徑不對,其他都正常 | 不是 → 那個捷徑自己指定了圖示,把捷徑重建一次 |
stk_updater / stk_uploader 換新圖示後重新編譯並佈署,直接從 EXE 裡把圖示抽出來檢查是新的,但桌面捷徑與 W: 磁碟清單全都還顯示舊圖示。先試 ie4uinit -show 無效 —— 已經被快取住的項目它救不回來,必須在檔案總管關閉的狀態下把快取檔刪掉。跑完這支就正常了。
桌面上的 STK32 捷徑原本指向 W:\S00X\STK32.EXE,Windows 有時會拿 .lnk 內的 LinkInfo(UNC 備援)去「修正」目標,把它改寫成 \\S001\stk\S00X\STK32.EXE —— 之後點兩下開不起來或特別慢,最常在重開機之後發生,而且可能整站一起中。本工具把捷徑改回 W: 路徑,並寫入登錄檔政策讓 Explorer 不再自作主張改寫。
fix_shortcut.bat # Windows 10 / 11 fix_shortcut_win7.bat # Windows 7 / Server 2008 R2 專用 fix_shortcut_win7.bat /silent # 不要最後的 pause(給排程/腳本呼叫) 位置:W:\TOOLS\ 與 W:\socket\agent\ 權限:一般使用者即可(只修自己的桌面+HKCU);要涵蓋公用桌面與 HKLM 請「以系統管理員身分執行」 生效:執行後請登出再登入(或重開機)
| 版本 | 修捷徑的做法 | 適用 |
|---|---|---|
| fix_shortcut.bat | PowerShell 一行流 | Windows 10 / 11 |
| fix_shortcut_win7.bat + fix_shortcut_win7.vbs | WSH(cscript + VBScript),Win7 內建即可跑 | Windows 7 / 2008 R2 |
原版在 Win7 上按了等於沒按:它用 [Environment]::GetFolderPath('CommonDesktopDirectory') 取公用桌面,而這個列舉值是 .NET 4.0 才新增的;Win7 SP1 內建 PowerShell 2.0 跑在 .NET 2.0 CLR 上,轉型當場拋例外 → 整段修捷徑一行都沒跑到,而且不顯示任何錯誤,看起來像「跑完了但沒修好」。Win7 版改用 WSH,沒有 .NET 相依。 | ||
| 步驟 | 內容 |
|---|---|
| ① 修捷徑 | 掃使用者桌面與公用桌面的 .lnk,凡目標是 \\server\share\S00X\STK32.EXE 的,改回 W:\S00X\STK32.EXE(工作資料夾一併改)。透過 WScript.Shell 編輯會保留 .lnk 的主控台屬性,所以 STK32 的框線字元不會變亂碼。 |
| ② 寫政策鎖 | LinkResolveIgnoreLinkInfo=1(忽略 .lnk 內的 UNC 備援)、NoResolveSearch=1(目標找不到時不要自己搜尋改寫)、NoResolveTrack=1(關閉分散式連結追蹤)。HKCU 一定寫;有管理員權限時連 HKLM 一起寫。 |
| 問題 | 解法 |
|---|---|
靜默失效最難發現:Win7 版第一版改用 VBScript 的 RegExp 比對路徑,反斜線跳脫少了一半 → 規則運算式語法錯誤,卻被 On Error Resume Next 吞掉,每台都回報「沒有需要修復的項目」—— 壞掉但不出聲。 | 改用純字串比對(判斷開頭兩個反斜線、最後一段是 STK32.EXE、倒數第二段是 S 開頭英數),完全不用 RegExp,沒有跳脫地雷。 |
兩個檔案必須成對:BAT 用 %~dp0 找同目錄的 VBS。 | 派送走整個目錄複製,兩檔一定一起到;真的少了 VBS 時會明確印出找不到,並且仍把政策鎖寫完,不會靜默失敗。 |
▸ 客戶說「桌面圖示點了打不開」
1. 先看捷徑內容 → 目標若變成 \\S001\stk\S00X\STK32.EXE 就是這個問題 2. Win10/11 跑 W:\TOOLS\fix_shortcut.bat;Win7 跑 W:\TOOLS\fix_shortcut_win7.bat 3. 登出再登入(或重開機) ※ 重複執行安全:捷徑正常時只會回報「沒有需要修復的項目」,不動其他捷徑
回答「為什麼指揮台 / 網頁遠端看不到這一站」。一次做完三件事:測這台電腦連不連得到中繼伺服器、列出中繼伺服器上目前登記了本公司哪些站台(站號、內網 IP、幾秒前回報)、再跟主機上實際存在的站台目錄比對,直接印出哪幾站沒連上與排查方向。唯讀,不更動任何設定,也不重啟任何程式。和 net_check 搭配:net_check 回答「網路通不通」,relay_check 回答「這一站到底有沒有登記上」。
relay_check.exe # 直接雙擊:查自己公司的所有站台 relay_check.exe > result.txt # 把結果存檔回傳(存檔時結束不會停住) relay_check.exe --nopause # 給排程/腳本呼叫,結束不等按鍵 位置:W:\TOOLS\relay_check.exe(隨自動更新派送;主機上是 C:\STK\TOOLS\) 權限:一般使用者即可 系統:Windows 7 / 10 / 11
| 段落 | 內容 |
|---|---|
| [1] 連線測試 | 解析中繼伺服器位址並實際連線,顯示成功與耗時;連不到就直接給結論,不往下查 |
| [2] 已登記的站台 | 中繼伺服器上本公司的每一站:站號、內網 IP、對外 IP、幾秒前回報(超過 90 秒會標示) |
| [3] 比對與結論 | 主機上有哪些站台目錄,哪幾站沒連上,以及要到那一站檢查什麼 |
| 結果 | 結論 |
|---|---|
| [1] 連線失敗 | 這台電腦連不出去 → 看「預設閘道」「DNS 伺服器」(手動設固定 IP 時最常漏填),或防火牆、防毒擋住 |
| [1] 成功,但某站不在 [2] 的清單 | 到那一站:確認背景代理程式有在跑、它自己目錄的設定檔(C:\StkAgent\S00X\stk_agent.ini)站號與序號正確;改完要重啟代理程式才生效 |
| 該站的紀錄檔一直出現「連線失敗」 | 到那一站上再執行一次 relay_check,看第 [1] 段 |
| 全部站台都在清單上 | 連線正常;指揮台重新整理清單即可 |
中繼伺服器上有所有客戶的站台。工具會自動讀出這台電腦的客戶序號,只顯示自己公司的站台,無法查詢其他公司的資料。
某客戶的 S003 背景代理程式明明在跑,指揮台卻一直看不到。逐層查下來是三個問題疊在一起:設定檔原本是錯的範本(站號、序號都不對);後來改對的是主機上那份,但代理程式讀的其實是它自己目錄那份;最後這台是手動設的固定 IP,漏填了閘道與 DNS —— 區網、共用磁碟都正常,唯獨連不出去,紀錄裡連線失敗了 140 次。補上閘道與 DNS 後一分鐘內自動連上。這支工具就是把當時的查法固定下來:第 [1] 段直接抓出「連不出去」,第 [3] 段直接列出沒連上的站。
關閉 Windows 7 檔案分享用戶端的三個快取(檔案資訊、目錄內容、找不到的檔案),解決「單據明細剛打進去又看起來消失」這一類症狀。★只要這台工作站是 Windows 7 就應該套用,不論主機是哪個版本。主機自己(資料放在本機、不經過網路)不需要套用。選單式操作,套用與回復都在同一支工具裡,套用前會自動備份登錄檔;條件不符時會拒絕套用並說明原因,而回復在任何版本都可以使用。
某客戶的工作站在打報價單時,明細打了四筆、畫面上卻突然只剩兩筆;補打之後又少了兩筆。當場進資料檔查,六筆資料全都在裡面、沒有任何刪除記錄,重建索引後六筆全部出現 —— 資料從來沒有遺失,是程式讀不回來。
奇怪的是同一套程式在 Windows 10 完全正常,而這個環境的前一代系統在同一台 Windows 7 上已經用了近二十年沒出過事。往下追才發現差別在資料庫引擎:新引擎的「記錄總數」是用檔案大小換算的,舊引擎是直接讀檔案開頭記錄的筆數。檔案大小屬於作業系統的檔案資訊,而 Windows 7 的檔案分享用戶端預設會把檔案資訊快取 10 秒 —— 剛寫進去的資料讓檔案變大了,程式卻還讀到十秒前的舊大小,於是以為筆數不夠。
某客戶的環境,把每一次新增明細與 自己上一次新增的時間間隔對照「筆數有沒有真的增加」:
| 工作站 | 距離上一次新增 | 失敗比例 |
|---|---|---|
| Windows 7 工作站 | 0 ~ 10 秒 | 8/20 = 40% |
| 10 ~ 30 秒 | 2/20 = 10% | |
| 超過 30 秒 | 0/57 = 0% | |
| 同環境的 Windows 10 工作站(三台) | 30 秒內的 115 次 | 0% |
打得越快越容易出現,停超過 30 秒就完全不會 —— 與「檔案資訊被快取十秒」的推論一致,這也是為什麼只有打單快的人會遇到。 同一個環境裡的 Windows 10 工作站,在同樣的高風險區間 115 次全部正常。
這一段原本寫的是
「必須『主機是 Windows 7』而且『工作站也是 Windows 7』兩個條件同時成立」。
這個說法已經被現場證據推翻,我們在此更正。
2026-10-06,另一個客戶的環境留下了完整的事故紀錄:
| 時間 | 發生什麼 |
|---|---|
| 15:10:45 | Windows 10 主機在一張報價單寫入第 3 筆明細,占用了某一筆記錄 |
| 15:11:47 | 同公司一台 Windows 7 工作站新增別張單的明細, 它算出來的「檔案目前有幾筆」是過期的, 於是新增動作落在同一筆記錄上,把主機剛寫入的那筆內容清成空白 |
| 結果 | 主機的操作者看著自己剛打好的那一行變成一條空白列 |
所以決定因素是「這台工作站是 Windows 7」,
主機是哪個版本只影響發生的頻率,不影響會不會發生。
而且被害的不一定是出問題的那台 —— 任何人的單據都可能被洗掉,包括主機。
這也是為什麼工具的判斷改成「只要這台是 Windows 7 工作站就套用」。
程式算「檔案目前有幾筆」是用檔案大小換算的, 而檔案大小屬於作業系統的檔案資訊。Windows 7 的檔案分享用戶端會把它快取起來, 因此可能拿到過期的筆數,讓新增的那一筆寫到別人剛寫過的位置上。 在工作站關掉這個快取等於繞過它。 這是目前最合理的解釋,我們沒有抓封包直接證實,所以標明為推論。
在檔案上按右鍵 > 以系統管理員身分執行 位置:W:\TOOLS\SmbCache.bat(隨自動更新派送;主機上是 C:\STK\TOOLS\) 權限:★必須系統管理員 系統:★僅適用 Windows 7 / Server 2008 R2 生效:★必須重新開機
| 項目 | 作用 |
|---|---|
| 1. 套用修正 | 三個快取時間設為 0。套用前自動把整個登錄檔機碼匯出備份;備份失敗就不做任何修改。這台不是 Windows 7、或資料放在本機(這台就是主機)時,此項停用 |
| 2. 回復原狀 | 從備份還原。任何 Windows 版本都可以使用 —— 若某台曾被誤套用,正是最需要解除的那台 |
| 3 / 4 | 重新顯示目前設定 / 列出備份檔 |
這三個設定值原本並不存在(Windows 使用內建預設:檔案資訊與目錄 10 秒、找不到的檔案 5 秒),所以「回復」是把它們刪掉回到未設定狀態,而不是填回 10。
條件不符的機器請不要套用:主機不是 Windows 7、或這台工作站不是 Windows 7、或這台的資料本來就放在本機(例如主機自己),改了都不會解決任何事,反而會讓所有檔案存取失去快取、拖慢整台機器。工具本身已經會擋,這裡再提醒一次。
要補充的是:這三個設定值在 Windows 10 一樣存在、預設值也相同。我們沒有證據說新版的用戶端不快取檔案資訊,只有「在上述環境裡沒有出事」的觀測結果 ——所以這裡不寫成「新版沒有這個問題」。
只有兩道關卡,主機是什麼作業系統只會顯示出來,不參與判斷:
| 關卡 | 判斷 |
|---|---|
| 1 | 這台不是 Windows 7 → 拒絕。並提醒:若這台是主機而公司裡有 Windows 7 工作站,要套用的是那些工作站 |
| 2 | 讀本機各站設定檔的資料目錄;資料放在本機(不經過網路) → 拒絕,因為檔案分享用戶端根本不在存取路徑上 |
| 通過 | = Windows 7 工作站 → 可以套用。畫面上會直接寫出判定結果,操作者不必自己推斷 |
「不改就會出事」已經有充分的現場數據(上表)。「改了就不再出事」這一半還在驗證中:某客戶的一台 Windows 7 工作站已於 2026-10-06 上午套用並重新開機,之後在高風險區間(間隔 30 秒內)的 12 次新增全部正常,而套用前同一台在同樣區間是 40 次中 10 次失敗。
12 次零失敗把「其實沒有效果」的機率壓到約 0.2%,方向明確但還不是定論,我們會持續累積。套用後請回報結果。
把資料檔裡「所有欄位都是空值」的無效記錄標記為已刪除,讓它們不再出現在任何查詢與報表。預設是檢查模式(只報告、不修改);正式執行前會先完整說明功用與前提、要操作者確認兩次,並自動備份。
某客戶的報價單明細檔裡累積了一批完全空白的記錄。成因是本公司 10/03 為了防止「新增失敗卻覆蓋上一筆」而加的一段保護,不慎讓每筆明細多做了一次新增動作 —— 10/05 已修正,但這段期間留下的空白記錄仍在檔案裡。這些記錄不影響帳務金額,卻會讓筆數對不上、也讓後續的對帳檢查一直報警,因此做了這支工具把它們清掉。
| 項目 | 說明 |
|---|---|
| 只改刪除旗標 | 只改每筆記錄的第 1 個位元組。記錄編號完全不變,索引仍然有效,不需要重建索引,檔案大小也不變 |
| 可以還原 | 真的誤刪可以用一般的「取消刪除」還原 |
| ★不做壓縮 | 壓縮(實體移除)會讓記錄編號全面位移,所有既有索引立刻指錯而且不會當機 —— 是無聲出錯,風險遠大於收益,所以刻意不做 |
直接雙擊 CleanEmptyDbf.exe,照選單操作:
1. 從本機站台資料目錄選檔 <-- 自動讀各站 stk.ini 的資料目錄設定,
2. 直接輸入完整路徑 列出該目錄下的 DBF 讓您選號碼
0. 離開
選定檔案後
1. 檢查(只報告,不修改) <-- 先跑這個
2. 正式執行(清除空白記錄)
3. 換一個檔案
0. 離開
命令列用法仍然保留:
CleanEmptyDbf.exe C:\STK\s001\dbf\QuotSub.DBF # 檢查
CleanEmptyDbf.exe C:\STK\s001\dbf\QuotSub.DBF --apply # 正式執行
位置:W:\TOOLS\CleanEmptyDbf.exe(隨自動更新派送;主機上是 C:\STK\TOOLS\)
權限:對該資料檔要有寫入權
系統:Windows 7 / 10 / 11
紀錄:每次動作會在 exe 同目錄的 CleanEmptyDbf.log 留一行
每次檢查都會印出總記錄數、已標記刪除筆數、待處理的空白記錄筆數。
待處理是 0 的時候,它會明確說「這個檔案已經是乾淨的」,並指出檔案裡已經有幾筆標記刪除的記錄、
同目錄若有備份檔就是上次執行留下的 —— 因為「已經清過了」與「這次沒作用」在舊版畫面上長得一模一樣,
現場就真的誤判過一次。
另外要提醒:用資料檔檢視工具去看時,若設定成顯示已刪除記錄,
那些清掉的空白記錄仍然會出現在畫面上 —— 本工具是標記刪除,不做實體移除,這是刻意的設計。
掃描之前會先檢查這是不是結構合理的 DBF:版本代碼、記錄長度、 各欄位長度總和與檔頭記錄長是否相符、檔案有沒有被截斷。不通過就直接拒絕並說出原因, 不會「掃出 0 筆」然後回報檔案乾淨。
| 順序 | 內容 |
|---|---|
| ① 事前說明 | 先完整說明這支程式的功用、會做什麼與不會做什麼、以及執行前提(全站已退出、已另外備份、指定的是資料檔而非索引檔),並顯示檔名與大小,確認後才繼續 |
| ② 筆數確認 | 掃描後報告「待標記刪除 N 筆」與記錄編號範圍,要打字輸入 YES 才真的寫入 |
| 自動備份 | 寫入前先把原檔複製一份到同目錄(與您自己的備份無關,雙保險) |
| 無法互動時 | 若在沒有鍵盤輸入的環境執行(排程、導向),一律視為取消,絕不會自行往下寫入 |
寫完會重新讀一次檔案並印出:總記錄數是否與原本相同、已標記刪除幾筆、是否還有殘留的空白記錄(應為 0)、檔案大小是否未變。不是只回報「完成」。
清除卡住的列印工作,以及刪了卻一直還在的印表機。全部用選單選號碼操作:先列出每台印表機的狀態與卡住的工作數,選好印表機、確認後才動手;最後手段的「強制清除」也是把暫存檔搬到備份資料夾,不直接刪除。也能檢查印到主機分享的印表機時「存取被拒」(這台以訪客身分連線),並幫這台存入主機帳密。
| 現象 | 原因 | 建議選項 |
|---|---|---|
| 列印工作卡在佇列,顯示「錯誤」,後面的工作全部排隊印不出來 | 第一個工作送不出去(印表機離線、連接埠指錯、主機共用名稱改過…),後面的都在等它 | 先 1 看狀況,再 3 取消 |
| 取消後工作停在「正在刪除」,一直不消失 | 列印服務還抓著這個工作正在送的資料 | 5 重新啟動列印服務 |
| 在 Windows 刪除印表機後,印表機還在,狀態「等待刪除」,重新開機也一樣 | Windows 要等佇列裡的工作印完才真正刪除;工作送不出去就永遠刪不掉 | 3 取消 → 5 重啟;或直接 7 移除 |
| STK32 的列印視窗、Ctrl+P 一直看到已經刪除的印表機 | 同上,Windows 本身還把它列為印表機 | 同上 |
| 3、5 都做了還是清不掉 | 佇列暫存檔損壞 | 6 強制清除 |
| 印表機接在主機、分享給工作站;只有某幾台印不出來(工作全部卡在佇列),同一台的 W: 磁碟卻正常 | 這台沒有存主機的帳密,以訪客 (Guest) 身分連到主機;訪客可以讀檔案分享,但寫入印表機分享被拒(錯誤碼 5) | 8 檢查 → 9 存入主機帳密 → 重新開機 → 4 清掉舊工作 |
2026-10-12 某客戶工作站修好列印(詳見〔錯誤修正〕同日條目)之後,被刪除的兩台印表機一直停在「等待刪除」,STK32 也一直看得到。原因是它們的佇列裡卡著幾張永遠送不出去的工作 —— 清掉這些工作、重新啟動列印服務之後才真正消失。當時是請現場人員逐行輸入指令完成的,所以把這套步驟做成這支工具,現場只要照選單按數字即可。
2026-10-16 加入選項 8、9:另一家客戶的某台工作站印不出來,工作全部卡在佇列,其他工作站都正常。遠端檢查發現各台都是印到主機分享的同一台印表機,差別在於能印的工作站都存了主機帳密、以主機帳號連線;印不出來的工作站沒存,以訪客身分連線,主機拒絕寫入印表機(Windows 列印事件 372「錯誤碼 5 存取被拒」)。另一台被認為正常的工作站其實也卡了 3 筆。選項 8 會直接列出這些差異並給判定,選項 9 讓現場自己存入帳密。
在檔案上按右鍵 → 以系統管理員身分執行,之後全部用數字鍵選擇:
1. 檢視所有印表機的狀態與卡住的工作數
2. 檢視某一台印表機的工作明細
3. 取消某一台印表機的全部工作
4. 取消所有印表機的全部工作
5. 重新啟動列印服務 (Print Spooler)
6. 強制清除列印暫存檔 (3、5 都清不掉時才用)
7. 移除印表機 (會先取消它的工作)
8. 檢查連到主機分享印表機的身分 (是不是以訪客 Guest 連線被拒)
9. 存入主機帳密 (讓這台以主機帳號連線,解決「存取被拒」)
0. 離開
選 1 時的畫面(← 表示有工作卡在佇列裡,或狀態不是「正常」):
編號 工作數 狀態 印表機名稱
---- ------ ------------ ------------------------------
1 0 正常 \\S001\Epson LQ-680C
2 1 錯誤 Epson LQ-680C (S002) ←
3 3 等待刪除、錯誤 Epson LQ-680C ←
選 2、3、7 會先列出上面的清單,輸入編號選印表機;
選 3~7 會先顯示要處理的對象,再選「1. 確定執行 / 2. 取消」才動手。
選 8 會列出:這台印到哪些主機分享的印表機、每台主機有沒有存帳密
(沒存會標「← 會以訪客 (Guest) 身分連線」)、最近 14 天印不出來的紀錄與錯誤碼,
最後一行給判定與下一步;在主機上執行時,另外列出每台工作站連進來用的帳號(訪客標 ←)。
選 9 依序輸入:主機名稱(直接按 Enter = 選 8 偵測到的主機)、帳號(只打 user
會自動補成 主機\user)、確認、密碼輸入兩次(畫面不顯示)。存完會讀回確認,
接著:重新開機 → 選 8 確認變成「有」→ 選 4 清掉卡住的舊工作 → 印一張測試。
★ 選 9 要用平常印東西的那個 Windows 使用者執行(畫面會顯示存在哪個使用者底下);
若按「以系統管理員身分執行」時要求輸入別的管理員帳號,帳密會存到那個帳號,
這時請改用「控制台 → 認證管理員」手動新增。
位置:W:\TOOLS\print_queue_fix.bat(隨自動更新派送;主機上是 C:\STK\TOOLS\)
權限:系統管理員
系統:Windows 7 / 10 / 11
| 項目 | 說明 |
|---|---|
| 先看再動 | 選 3~7 都會先列出要處理的印表機與工作,再選「1. 確定執行 / 2. 取消」 |
| 只動這台電腦 | 取消工作、移除印表機都只作用在執行這支工具的電腦,不會動到主機或其他工作站的印表機 |
| 強制清除不刪檔 | 選 6 時佇列暫存檔是搬到工具旁的 print_queue_backup\日期時間 資料夾(放不了就放到暫存目錄) |
| 不改設定 | 不修改印表機驅動程式、連接埠、共用名稱或預設印表機;唯一會新增設定的是選 9,把主機帳密存進這個 Windows 使用者的「認證管理員」,已有舊帳密會先提示將被取代 |
| 密碼不落地 | 選 9 的密碼輸入時不顯示、要輸入兩次相同,只交給 Windows 認證管理員保存,不寫進任何檔案或紀錄;選 8 只讀取,不改任何東西 |
| 清不掉會說 | 取消後會重新計算剩下幾個工作;移除後若印表機還在,會明確提示改用 5 或 6,不會只回報「完成」 |
# 以系統管理員身分開啟 PowerShell,依序執行(印表機名稱請換成實際名稱) # ① 看哪一台卡住:狀態有 PendingDeletion(等待刪除)或 Error,就是它 Get-Printer | ft Name,PrinterStatus,JobCount -auto # ② 看卡住的工作(JobStatus 常見:Error、Deleting = 正在刪除) Get-PrintJob -PrinterName 'Epson LQ-680C' | ft Id,DocumentName,UserName,JobStatus,SubmittedTime -auto # ③ 取消這台的全部工作 Get-PrintJob -PrinterName 'Epson LQ-680C' | Remove-PrintJob # ④ 工作停在「正在刪除」消不掉:重新啟動列印服務 Restart-Service Spooler -Force # ⑤ 還在:強制清除(停服務 → 把佇列暫存檔搬走 → 啟動服務) Stop-Service Spooler -Force md C:\print_queue_backup -Force Move-Item C:\Windows\System32\spool\PRINTERS\* C:\print_queue_backup -Force Start-Service Spooler # ⑥ 要刪掉的印表機:工作清空後再移除 Remove-Printer -Name 'Epson LQ-680C' # Windows 7 沒有 Get-Printer / Get-PrintJob,可改用: # net stop spooler # move C:\Windows\System32\spool\PRINTERS\*.* C:\print_queue_backup\ # net start spooler