2016-10-10 46 views
3

我想要製作一個批處理文件,它讀取一個txt文件「ayylmao.txt」並找到一個特定的單詞「hello」並將其替換爲「 xello」。批處理文件讀取特殊字符的txt並替換它中的一個字

事情是,「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 

你可以看到「你好」現在是「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. 
) 

此代碼適用於不具有特定的字符,如果很好地利用它像這樣的文件:

code.bat "hello" "xello" "ayylmao.txt">"ayylmao1.txt" 

此代碼僅在ayylmao1.txt中鍵入幾個特殊字符,但會替換hello。我想要在那裏輸入所有特殊字符。

我做了這樣的:

chcp 1252 
code.bat "hello" "xello" "ayylmao.txt">"ayylmao1.txt" 

但沒有奏效。它像第一個代碼一樣工作。

如果在PowerShell中有這樣做的話,我很樂意聽到它。

回答

5

你有什麼看起來像一個二進制文件,而不是文本文件,儘管擴展名。批處理編輯二進制文件並不好。在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) 

你需要,如果你想調整這個代碼替換的工作方式不同(也可以替換其他事件,替換不同的事件,......)。

1

但它沒有奏效。它像第一個代碼一樣工作。幫幫我 ?

此批處理代碼是從這個site到來並沒有給discussion鏈接爲什麼它不包含特殊字符的工作。

+0

這不適用於OP顯然具有的二進制文件。 –

+0

@AnsgarWiechers你是對的。我將編碼類型修改爲Byte而不是UTF8。 – paul543

+0

將編碼設置爲Byte,您將得到一個沒有方法Replace()的字節數組。 –

相關問題