【发布时间】:2021-07-20 23:55:59
【问题描述】:
我有以下文件,其中每个新行都是用字符 ~\r\n<CR><LF> 创建的。
我想删除所有出现的~\r\n<CR><LF> 并替换为“”(空字符串),以便所有文件数据出现在一行上。为此,我在 VBScript (replace.vbs) 中编写了一个脚本,并在命令行中使用cscript replace.vbs "~\r\n<CR><LF>" "" 运行它——第一个参数是我要替换的原始字符,第二个参数是要写入文件的新文本.
我的脚本可以成功替换常规文本 - 例如,如果我只传递 <CR><LF> 作为要替换的字符串,它将按预期工作。但我的问题是当我通过完整的~\r\n<CR><LF> 时,它根本不会修改文件。我认为这与错误地将 ~\r\n 字符传递到命令中有关。
以下是我的脚本:
Const ForReading = 1
Const ForWriting = 2
strOldText = Wscript.Arguments(0)
strNewText = Wscript.Arguments(1)
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "D:\FTP\Private\EDI\KleinschmidtTemp\"
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
For Each objFile in colFiles
if instr(objFile.Name,"BRO") <> 0 and instr(objFile.Name,".edi") <> 0 then
Set objFileToRead = objFSO.OpenTextFile(objStartFolder + objFile.Name, ForReading)
strText = objFileToRead.ReadAll
objFileToRead.Close
strNewText = Replace(strText, strOldText, strNewText)
Set objFileToEdit = objFSO.OpenTextFile(objStartFolder + objFile.Name, ForWriting)
objFileToEdit.WriteLine strNewText
objFileToEdit.Close
objFSO.MoveFile objStartFolder + objFile.Name, "D:\FTP\Private\EDI\Kleinschmidt\Outgoing\" + objFile.Name
end if
Next
编辑:所以我发现对于我们的生产文件,<CR><LF> 不会是纯文本 - 它们实际上是不可打印的 ASCII 控制字符。所以我对我的脚本进行了以下更改,我使用Chr() 函数来获取这些字符并正确替换它们。
Const ForReading = 1
Const ForWriting = 2
'strOldText = Wscript.Arguments(0)
'strNewText = Wscript.Arguments(1)
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "D:\FTP\Private\EDI\KleinschmidtTemp\"
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
For Each objFile in colFiles
if instr(objFile.Name,"BRO") <> 0 and instr(objFile.Name,".edi") <> 0 then
Set objFileToRead = objFSO.OpenTextFile(objStartFolder + objFile.Name, ForReading)
strText = objFileToRead.ReadAll
objFileToRead.Close
'strNewText = Replace(strText, strOldText, strNewText)
strNewText = Replace(strText, Chr(10), "") ' 10 is ASCII code for LF, line feed
strNewText = Replace(strNewText, Chr(13), "") ' 13 is ASCII code for CR, carriage return
Set objFileToEdit = objFSO.OpenTextFile(objStartFolder + objFile.Name, ForWriting)
objFileToEdit.WriteLine strNewText
objFileToEdit.Close
'objFSO.MoveFile objStartFolder + objFile.Name, "D:\FTP\Private\EDI\Kleinschmidt\Outgoing\" + objFile.Name
end if
Next
我仍然有一个问题...当我打开生成的文件时,所有内容都在一行中,这正是我想要的。但是我的脚本没有删除文件末尾的<CR><LF>,所以有一个额外的空行。我该如何解决这个问题?
【问题讨论】:
-
从示例文件来看,
<CR><LF>只是文字文本,因此要替换\r和\n使用vbCr和vbLf或vbCrLf或vbNewLine。见\r\n, \r and \n what is the difference between them? -
@user692942 请看我的编辑,我发现
<CR><LF>实际上并不是明文。不知道为什么我的问题被关闭了,因为我只是编辑它:( -
分别与
vbCr和vbLf相同。您需要了解在 VBScript 中指定回车符和换行符的不同方式,因此需要了解重复项以及关闭问题的原因。 -
@user692942 谢谢,我明白这一点,但在我的问题和您链接的问题中,这些方法似乎并没有完全删除所有换行符。就我而言,最后一个换行符仍然存在。这正常吗?
标签: command-line vbscript command-line-arguments