我试图做一个batch file,读取一个txt文件“ayylmao.txt”,并find一个特定的单词“你好”,并用“xello”replace它。
事情是,“ayylmao.txt”包含特定的字符。
Ayylmao.txt看起来像这样:
‹‹R‹Ę‹/M‹;Ču‹č˙˙˙‹‹@‰‹‹@CëC;Đu‹čq˙˙˙‹‹@C‹D$‰;7u®‹Ó‹Ćčúţ˙˙„Ŕu3Ŕ‰YZ]_^[ĂŤ@ SVWUÄđ‰$‹ô‹‰D$‹ ‹‹@;Č‚† ‹Ř‹>_‹ůz;ßrv;Ču!‹B‹A‹B‹)B‹x uV‹čđţ˙˙ëM‹Ř‹>_‹ůz;ßu ‹B‹)Bë3‹Z‰\$‹>‹‹.}+ű‰|$+Č‹‰HŤT$‹čMţ˙˙„Ŕu3 hello Ŕë°ë‹‹ ‰‹;D$…Y˙˙˙3ŔÄ]_^[ĂSVW‹Ú‹đţ }ľ ëĆ˙˙ ć ˙˙‰sjh Vj
你可以在最后一行看到“你好”字样。 我希望批处理进程,并给我一个看起来像这样的ayylmao1.txt:
‹‹R‹Ę‹/M‹;Ču‹č˙˙˙‹‹@‰‹‹@CëC;Đu‹čq˙˙˙‹‹@C‹D$‰;7u®‹Ó‹Ćčúţ˙˙„Ŕu3Ŕ‰YZ]_^[ĂŤ@ SVWUÄđ‰$‹ô‹‰D$‹ ‹‹@;Č‚† ‹Ř‹>_‹ůz;ßrv;Ču!‹B‹A‹B‹)B‹x uV‹čđţ˙˙ëM‹Ř‹>_‹ůz;ßu ‹B‹)Bë3‹Z‰\$‹>‹‹.}+ű‰|$+Č‹‰HŤT$‹čMţ˙˙„Ŕu3 xello Ŕë°ë‹‹ ‰‹;D$…Y˙˙˙3ŔÄ]_^[ĂSVW‹Ú‹đţ }ľ ëĆ˙˙ ć ˙˙‰sjh Vj
你可以看到“hello”现在是“xello”。
我发现这个batch filereplace文本文件中的一个单词:
@echo off REM -- Prepare the Command Processor -- SETLOCAL ENABLEEXTENSIONS SETLOCAL DISABLEDELAYEDEXPANSION if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do ( set "line=%%B" if defined line ( call set "line=echo.%%line:%~1=%~2%%" for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X ) ELSE echo. )
这个代码适用于没有特定字符的文件,如果像这样使用它:
code.bat "hello" "xello" "ayylmao.txt">"ayylmao1.txt"
这个代码只在ayylmao1.txt中input几个特殊字符,但是代替了hello。 我想要所有在那里input的特殊字符。
我是这样做的:
chcp 1252 code.bat "hello" "xello" "ayylmao.txt">"ayylmao1.txt"
但它没有工作。 它像第一个代码一样工作。
如果在PowerShell中有这样一个方法来做到这一点,我会很高兴听到它。
你有什么看起来像一个二进制文件,而不是文本文件,尽管扩展名。 批处理编辑二进制文件是不好的。 在PowerShell中是可行的,但是您需要使用数据字节而不是简单的文本。
这是一个基本的例子,它会在你的文件中找到第一个字符串“hello”,并用“xhello”代替它:
$f = 'C:\path\to\ayylmao.txt' $stext = 'hello' $rtext = [char[]]'xhello' $len = $stext.Length $offset = $len - 1 $data = [IO.File]::ReadAllBytes($f) # find first occurrence of $stext in byte array for ($i=0; $i -lt $data.Count - $offset; $i++) { $slice = $data[$i..($i+$offset)] if (-join [char[]]$slice -eq $stext) { break } } # Once you know the beginning ($i) and length ($len) of the array slice # containing $stext you can "cut up" $data and concatenate the slices before # and after $stext to the byte sequence you want to insert ($rtext): # # |<-- $stext -->| # [...]['h','e','l','l','o'][...] <-- $data # ^ ^ ^ ^ # | | | | # | $i | $i+$len # $i-1 $i+$offset (== $i+$len-1) # $rdata = $data[0..($i-1)] + [byte[]]$rtext + $data[($i+$len)..($data.Count-1)] [IO.File]::WriteAllBytes($f, $rdata)
如果您希望替换工作方式不同(也可以替换其他替代项,替换不同的替代项…),则需要调整此代码。
但它没有工作。 它像第一个代码一样工作。 帮帮我 ?
这个批处理代码来自这个网站,并有一个讨论为什么它不适用于特殊字符的链接。