wku*_*kup 3 windows powershell batch-file
我正在尝试制作一个读取txt文件"ayylmao.txt"的批处理文件,并找到一个特定的单词"hello"并将其替换为"xello".
问题是"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
Run Code Online (Sandbox Code Playgroud)
您可以在最后一行看到"hello"字样.我希望批处理进入该过程并给我一个看起来像这样的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
Run Code Online (Sandbox Code Playgroud)
你可以看到"你好"现在是"xello".
我发现这个批处理文件替换了文本文件中的单词:
@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.
)
Run Code Online (Sandbox Code Playgroud)
如果使用这样的代码,此代码适用于没有特定字符的文件:
code.bat "hello" "xello" "ayylmao.txt">"ayylmao1.txt"
Run Code Online (Sandbox Code Playgroud)
此代码仅在ayylmao1.txt中输入几个特殊字符,但替换为hello.我想要输入所有特殊字符.
我这样做了:
chcp 1252
code.bat "hello" "xello" "ayylmao.txt">"ayylmao1.txt"
Run Code Online (Sandbox Code Playgroud)
但它没有用.它就像第一个代码一样工作.
如果在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)
Run Code Online (Sandbox Code Playgroud)
如果您希望替换以不同的方式工作(也可以替换其他实例,替换不同的实例,......),则需要调整此代码.
| 归档时间: |
|
| 查看次数: |
475 次 |
| 最近记录: |