Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:如何移除文字檔中最後的復位換行?


如何移除文字檔中最後的復位換行?

嗨,Scripting Guy!我要如何移除文字檔中最後的復位換行?

-- LEK

LEK,您好。您在電子郵件其剩的部分提到,您是使用 FileSystemObject 來讀取文字檔,然後將該文字檔的內容用作為另一個應用程式中的查詢。不幸的是,文字檔在結尾必定都有復位換行,而這個復位換行在您試著將檔案內容當成查詢傳遞時,會造成問題。

所有這些是什麼意思呢?先來考量一下以下簡單的小文字檔。我們開啟檔案然後按 Ctrl+End 將游標置放在檔案結尾。請注意游標不會馬上出現在第 1 行的句號之後,反而是出現在第 2 行的行首。那是因為在句號之後緊接著一個復位換行 (就像是有人鍵入第一行之後按下 ENTER 一樣)。您在螢幕上或許什麼都看不到,但它還是存在,而且會造成問題:

復位換行


那要如何去除那個討厭的小復位換行呢?方法如下:

  • 我們將開啟檔案,然後將該檔案的內容讀入為一個名為 strFile 的變數。
  • 我們將要抓取儲存於該變數中的最後 2 個字元。為什麼是最後 2 個字元呢?因為復位換行實際上包含兩個不同的字元:換行字元 (ASCII 值為 13) 以及換行鍵 (ASCII 值為 10)。雖然單單除去換行鍵應該就可以了,可是我們還是決定按部就班來做,然後同時刪除這 2 個字元。
  • 我們將檢查看最後字元是否有值為 13 的 ASCII 與值為 10 的 ASCII;有個簡單的方法就是看它們是否等於 VBScript 的 vbCrLf 常數 (這剛好也是復位換行)。如果最後 2 個字元等於 vbCrLf,我們會從字串中砍掉這 2 個字元,然後將新值 (已刪減復位換行) 存回原始文字檔中。如果不等於 vbCrLf,那我們就什麼也不用做,這樣也沒有理由進行任何動作。

都了解嗎?這個指令碼可以完成所有的工作:

Const ForReading = 1
Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\scripts\test.txt", ForReading)
strFile = objFile.ReadAll
objFile.Close
intLength = Len(strFile)
strEnd = Right(strFile, 2)
If strEnd = vbCrLf Then
    strFile = Left(strFile, intLength - 2)
    Set objFile = objFSO.OpenTextFile("C:\scripts\test.txt", ForWriting)
    objFile.Write strFile
    objFile.Close
End If

我們一開始先指定一組常數 (ForReading 與 ForWriting),這在處理文字檔時會用到。接著建立一個 FileSystemObject 的執行個體,並使用 OpenTextFile 方法來開啟 C:\Scripts\Test.txt 檔案。然後再使用 ReadAll 方法來讀取文字檔中全部的內容,並且將該資訊儲存於一個名為 strFile 的變數中。之後馬上關閉文字檔 (為什麼呢?因為 FileSystemObject 只允許開啟一個檔案進行讀取或寫入動作。由於我們必須讀取檔案,因此一定要開啟檔案;如果稍後有需要修改該檔案,也需要重新將之開啟來寫入。既然讀完檔案了,乾脆就把它關閉)。

接下來我們使用 Len 函式來決定 strFile 變數的長度 (也就是說,字串中有幾個字元)。此值 (等一下會用到) 是儲存於 intLength 變數中。

到目前為止都沒問題吧?現在我們需要決定現有的檔案在結尾處是否有復位換行。跟之前提過的一樣,這表示要檢查看看檔案中最後 2 個字元是否包含一個換行字元與一個換行鍵。因此我們使用 Right 函式來抓取該字串最後面的兩個字元,然後將之儲存到 strEnd 變數中。這就是我們在這行程式碼所做的:

strEnd = Right(strFile, 2)

接下來我們可以檢查看 strEnd 是否等於 vbCrLf。如果是,就使用這一行程式碼來抓取除了最後的兩個字元以外的所有字元:

strFile = Left(strFile, intLength - 2)

記得我們使用 Len 函式來決定字串中有幾個字元嗎?我們現在就用該值來取得第一個「長度 – 2」個字元;例如,假設字串有 37 個字元,我們只會取得最初的 35 (37 – 2) 個。那可以有效地砍除字串尾端的復位換行。

我們接著重新開啟文字檔 (這一次是為了寫入),然後以新的字串值替換現有的內容。得到的結果是原始的文字檔,減去行尾復位換行。而這不正就是您要的嗎!


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首