2012-07-06 18 views
3

我遇到問題&替換已寫入的批處理腳本。我需要能夠打開一個文本文件,並從Windows命令行中更改它的一些值。我無法安裝sed.exe或FART或PowerShell,所以我需要這樣做。 它是如此容易得多,在linux做....查找並替換不符合空格的腳本/每行多個值

到目前爲止,我已經寫了這以下scrtipt如果我使用的只有每行一個字一個文件,它完美的作品,所以我可以很容易更改以下格式的文件

AAA
BBB
CCC

而這裏的批處理文件:

@echo off 
setlocal enabledelayedexpansion 

if not exist "%1" (echo this file does not exist...)&goto :eof 

for /f "tokens=* delims=" %%a in (%1) do (

    set write=%%a 
    if "%%a"=="%2" set write=%3 

    echo !write! 
    (echo !write!)>>%~n1.replaced%~x1 
) 

del %1 
rename %~n1.replaced%~x1 %1 

我的問題是我最需要改變的文件包含字符串和數字的多個值的行,像這樣:

AAA 1.5
BBB 25
CCC 0.1

誰能告訴我爲什麼我的腳本將不會改變BBB 25BBB 45?這是否與分隔符是一個空間有關?我很確定它與數字無關,就好像我有一個由空格隔開的單詞文件,我的腳本也不會工作。

我一直在搜索論壇,並沒有發現這個問題,但我會繼續搜索。無論如何,您的幫助將不勝感激。

UPDATE
問題解決了!我在DosTips.com上發現了BatchSubstitute.batthis revision,只是在臨時文件中添加額外的迴應已解決了我的問題。我仍然不確定爲什麼我發佈的代碼不起作用,因此如果有人能夠解釋它會很好。所有這些我都很新!

更新2
這裏有我需要從改變一個典型的輸入文件:

K1 1E3
K2 2E5
ñ1.5
×10

並經過我運行腳本(replace.bat prefs.txt「k1 1e3」「k1 5e4」)應該是:

K1 5E4
K2 2E5
N1。5
×10

它應該能夠改變任何行的文件中。在上次更新的論壇版本似乎能夠工作,我只是不知道爲什麼我發佈的第一個版本不起作用。

+0

+1陳述良好的問題和「它是如此容易...」。祝你好運。 – shellter 2012-07-06 14:37:08

+0

哈哈,謝謝。我其實剛剛嘗試了[另一篇文章]中提到的dostips.com中的BatchSubstitute.bat(http://stackoverflow.com/questions/60034/how-can-you-find-and-replace-text-in-一個文件 - 使用 - 的 - 窗口的命令行-ENVIR)。在我的Windows 7機器上,它會顯示替換的文本,但不覆蓋文件,但在XP機器上,我需要這個工作,它根本不工作。需要以某種方式將兩個文件拼接在一起。 – jpmorr 2012-07-06 15:01:26

+0

你可以編輯你的文章,包括顯示輸入和輸出的示例運行?或者你只需​​要'...設置寫入「%3」'(注意dbl-quotes)。祝你好運。 – shellter 2012-07-06 15:52:34

回答

1

回答你的update2問題。

它應該能夠更改文件中的任何行。在上次更新的論壇版本似乎能夠工作,我只是不知道爲什麼我發佈的第一個版本不起作用。

這是因爲該行
if "%%a"=="%2" set write=%3
將不匹配您的任何線路。
作爲%2將擴大到"k1 1e3"所以該線路將擴大到

if "%%a"==""k1 1e3"" set write="k1 5e4"

一個簡單的波浪應該做的​​伎倆
if "%%a"=="%~2" set write=%~3

+0

用於'%〜'刪除引號。不錯的把戲 – SeanC 2012-07-06 16:37:51

+0

是的!謝謝,那現在完美。 – jpmorr 2012-07-06 16:43:53

+0

其實只是遇到了另一個問題 - 文件名的絕對路徑。如果我在'rename%〜n1.replaced%〜x1%1'時給出一個_「C:\ Data \ prefs.txt」的文件名,它會在刪除原始文件後給出語法錯誤警告。這是我需要把另一個代字號嗎? – jpmorr 2012-07-06 16:57:19

0

是的,問題在於用空格(或引號,如果試圖將文本保留在一起)

使用命令行test test.txt BBB 25 BBB 45,則%2爲BBB,它不會匹配BBB 25作爲25丟失

隨着test test.txt "BBB 25" "BBB 45"命令行,然後2%是"BBB 25",它不會匹配BBB 25作爲引號丟失。