上周我曾要求你们用.bat脚本替换带换行符的字符串。我已经意识到我的文件已经有一些回车符和换行符,我需要首先删除然后再进行替换。 取代### @ ###'使用换行符我使用下面的行。
(gc $Source) -replace "#@#@#", "`r`n"|set-content $Destination
所以我尝试实现相同的逻辑来替换\ r和\ n,但它没有用。
(gc $Source) -replace "`n", ""|set-content $Destination
我的文件如下:
abc|d ef|123#@#@#xyz|tuv|567#@#@#
我需要让它看起来像
abc|def|123 xyz|tuv|567
像我说的那样,用新行替换行分隔符字符,但我需要先删除所有cr和lf字符。
对于小文件,下面的脚本可以正常工作,但是我的文件大于1.5GB并且它会抛出OutofMemoryException错误
param
(
[string]$Source,
[string]$Destination
)
echo $Source
echo $Destination
$Writer = New-Object IO.StreamWriter $Destination
$Writer.Write( [String]::Join("", $(Get-Content $Source)) )
$Writer.Close()
答案 0 :(得分:0)
这是vbscript。 Windows不一致。主要是它打破CR并删除LF(所有内置编程语言)。但编辑控件(即记事本)在LF上中断并忽略CR(除非在LF之前)。
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Do Until Inp.AtEndOfStream
Text = Inp.readall
Text = Replace(Text, vbcr, "")
Text = Replace(Text, vblf, "")
Text = Replace(Text, "#@#@#", vblf)
outp.write Text
Loop
这使用了StdIn和StdOut的重定向。
过滤命令的输出
YourProgram | Cscript //nologo script.vbs > OutputFile.txt
过滤文件
Cscript //nologo script.vbs < InputFile.txt > OutputFile.txt
请参阅我的CMD备忘单,了解Windows的命令行Command to run a .bat file
因此,这将删除以win.ini结尾的行,并打印以显示现在的一行win.ini。
cscript //nologo "C:\Users\David Candy\Desktop\Replace.vbs" < C:\windows\win.ini
答案 1 :(得分:0)
使用以下功能删除特殊字符。将所有这些内容放在 $ SpecChars 中您要移除的内容,并使用文本数据作为参数调用该函数。
Function Convert-ToFriendlyName
{param ($Text)
# Unwanted characters (includes spaces and '-') converted to a regex:
#Whatever characters you want to remove, put it here with comma separation.
$SpecChars = '\', ' ','\\','-'
$remspecchars = [string]::join('|', ($SpecChars | % {[regex]::escape($_)}))
# Convert the text given to correct naming format (Uppercase)
$name = (Get-Culture).textinfo.totitlecase(“$Text”.tolower())
# Remove unwanted characters
$name = $name -replace $remspecchars, ""
$name
}
希望它有所帮助...... !!!