同事回報一枚詭異茶包,某上古神獸級的老 VBScript 排程,在更換執行身分後所輸出的固定欄寬文字檔錯誤,中文欄位右側填補空白數不對,多出三個空白。但讓人無法理解的是:程式完全沒動,換了執行身分權限不對還能理解,執行成功但結果多出空白是什麼鬼?

取回 Log 分析並檢視程式碼,推測與字數計算邏輯有關。出錯部分限定欄寬 12 Bytes,BIG5 編碼每個中文 2 Bytes,三個中文字應補 6 個空白,出錯時則補了 9 個空白。字串長度函式為清代文物,已知有 BIG5 難字問題,但本案例字串全為中文常用字,更重要的是,原本正常,切換執行身分後才出錯,多喜爹?

腦海浮現一名嫌犯,實驗證實了我的推測:

我寫了一小段 VBScript 呼叫前述清朝函式計算「中文測試」四個中文字的長度。同樣的程式,第一次執行結果為 8(正確),第二次執行結果為 4! 同一個使用者一鏡到底,神奇吧?

解答在這篇舊文裡:【茶包射手日記】VBScript ASC() 中文傳回 63

實驗的兩次執行間,我將該使用者的 Windows 國別語系設定由中文(台灣)改為英文,當改為英文,中文字元 ASC() 傳回 63 被視為單一 Byte,即為 4 的由來。而本案例中排程改用的是新建立帳號,語系仍延用英文版 Windows 預設值 English,導致看似詭異的結果。

要不是先前遇過類似狀況(重要的是我寫了筆記而且沒失憶),這詭異茶包恐怕要射到天荒地老吧?2018 年還被 VBScript 狠咬一口,也算是鄉野奇譚了,哈!

2018-09-30 補充 - 呼叫 SetLocale() 可避免類似問題

A weird issue. After execution account chang, the sceduled task running VBScript didn't return correct space padding result. After investigation, I found it is caused by different region settings between execution accounts.


Comments

# by 不知道排到幾號的鐵粉

黑大,我建議用以下您的舊文章指定語系與字型後跑程式,結束程式再還原設定,這樣不管那個身分都能跑 https://blog.darkthread.net/blog/weird-vbscript-len-issue-again/

# by 不知道排到幾號的鐵粉

黑大:請把網址改成這個,我前則貼錯了Q_Q https://blog.darkthread.net/blog/command-prompt-codepage/

# by Jeffrey

to 不知道排到幾號的鐵粉, 謝謝提醒。剛好FB也有網友提到相似技巧,晚點來整理一篇補充好了。

Post a comment