【问题标题】:Search and Edit a file with a Batch file使用批处理文件搜索和编辑文件
【发布时间】:2011-11-17 09:48:39
【问题描述】:

我希望能够使用批处理文件编辑 txt 文件。这有点复杂。

首先,文件名是 frog.properties,可以在记事本中正常打开,但在计算机上可以运行; .properties 的文件类型与记事本无关。如果文件需要它可以建立关联,但我想避免这种情况。

其次,需要编辑的文本是文件中的一行。我们要编辑的行上的前 9 个字符对于该行是唯一的,并且在编辑后将保持不变。但是,该行在文件中的位置以及该行之后的内容因机器而异。如果需要删除并添加到末尾,则可以在文件中移动该行。

到目前为止,我发现下面列出的代码找到了here 并稍微编辑了它。现在,当我运行批处理文件(名为 replace.cmd 或 replace.bat)时,它只是回显“此文件不存在”并退出提示。我已验证文件在该位置。

将来我希望能够通过更改文件位置和要查找和编辑的文本来轻松地使用它来编辑任何 .ini 或 txt 文件。由于我将在其中使用它的环境,可以运行它的文件类型需要是 .bat 或 .cmd。

谢谢。

@echo off
setlocal enabledelayedexpansion

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


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

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

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

replace "C:\Users\ME\Desktop\test.txt" "withquot=*" "withquot=it worked"

pause
:Failed
pause

更新 2011 年 9 月 20 日

现在该文件将回显“此文件不存在”并暂停。所以我删除了if not exist "%1" (echo this file does not exist...)&goto :Failed这一行

我得到了

invalid Switch - "withquot=it worked"
我尝试从无效开关中删除“=”并得到相同的invalid switch 我尝试使用set 设置各个变量并更改文件中的引用。我已经尝试将测试文件移动到 C 的根目录并更改引用。

测试文件目前是这样的

test file
withquot=didntwork
USING_LOCAL_SHARED_MEM=1

我似乎没有什么能让这个文件正常工作,我一定是遗漏了一些小东西,或者这个文件的方向完全错误。我已经在 Vista 和 Windows 7 上测试了该文件。您看到的文件有问题吗?

底线,我不在乎如何,但我希望能够使用批处理文件编辑 .txt 文件,并且能够进行行替换。

【问题讨论】:

  • 这看起来应该像你需要的那样工作 - 究竟是什么不工作?它接受任何位置的任何文件名、要查找的任何文本以及命令行上的任何替换文本(如您的示例使用所示)。
  • 我看到您的待编辑。您以其他用户身份登录(“Maskedplant”而不是“MaskedPlant”),因此它不接受它作为原始海报。再试一次,以用户 ID 为“945884”的“MaskedPlant”身份登录。 :)
  • 我认为未解决的部分是他希望能够编辑该行,而不是完全替换它。例如,更改 ini 文件变量的值,通过变量名引用它。此代码完全替换了该行。话虽如此,通过传递正确的参数,这段代码就可以完成这项工作。也许您想要实现的具体示例可以帮助我们了解您还需要什么。
  • 对不起,我最初以未注册用户的身份发布了此内容。我不在乎编辑行与替换它。现在该文件根本不起作用。我希望它在位于 1 的文件中搜索 2 中列出的文本,并将 2 所在的行替换为列出的文本 3。现在当我运行文件时,它只是回显“此文件不存在”并关闭。就像它要么找不到文件,要么不明白 %1 是什么。有没有不同的顺序我应该把它全部放进去?我应该以某种方式先替换行并调用其余的吗?

标签: batch-file command-line-arguments replace ini


【解决方案1】:

我仍然很想知道如何在批处理文件中执行此操作,但我找到了一种使用来自here 的 vbs 脚本的方法。使用 .cmd 文件或 .bat 文件时,我一直遇到在查找或替换中出现 = 的问题,或将所有内容弄乱。

我将文件从该位置更改为参数 2 到 X 上的循环,以便文件的格式为在位置 (2) 和 (3) 和 (4) 中查找 (0) 替换为 (1)...

Option Explicit

Const ForReading = 1
Const ForWriting = 2
Dim Puppet, strOld, strNew, i
Puppet = 0
strOld = WScript.Arguments.item(0)
strNew = WScript.Arguments.item(1)
i = 1

On Error Resume Next
Do While i <= WScript.Arguments.count
    i = i + 1
    Call update(WScript.Arguments.item(i), strOld, strNew)
    Puppet = Puppet Or (Err.Number = 0): Err.Clear
Loop
On Error GoTo 0

Sub update(strFile, strOld, strNew)
Dim objFSO, objFile, strText, strNewText
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFile, ForReading)
strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, strOld, strNew)
Set objFile = objFSO.OpenTextFile(strFile, ForWriting)
objFile.WriteLine strNewText
objFile.Close
End Sub

【讨论】:

    【解决方案2】:

    这很容易。听说过在

    末尾添加 >NUL
    pause
    

    ?好吧,>NUL 创建了一个名为 NUL 的文件。只需输入

    echo (text) >C:\Users\%userprofile%\Desktop\myfile.txt
    

    这也适用于创建批处理文件。不需要“()”。 要添加更多行,只需像这样输入:在这种情况下需要“()”。

    (echo First line.
    echo Second line.
    echo Third line.) >C:\Users\%userprofile%\Desktop\myfile.txt
    

    它会是什么样子:

    First Line.
    Second Line.
    Third Line.
    

    现在是批处理文件:

    (echo @echo off
    echo echo Second line.
    echo pause) >C:\Users\%userprofile%\Desktop\myfile.bat
    

    这将使它在编辑时看起来像这样:

    @echo off
    echo Second Line.
    pause
    

    会像这样运行:

    Second Line.
    Press any key to continue...
    

    设置变量时,请记住,如果,假设您键入

    set /p "%password%=?"
    

    要进入新文件,它会去掉 %% 并使其只是“密码”。 要解决此问题,请键入:

    set /p "%%password%%=?"
    

    它会正确显示。如果您在构建新的批处理文件之外设置变量,比如说

    set /p "%password%=?"
    

    然后输入

    if not %password%==? goto whatever
    

    在新的批处理文件中,它会在一个文件中设置密码,然后在下一个文件中设置密码,因为它是在创建新文件之前设置的。 如果这还不够清楚,请与我联系,我会向您发送一些我过去使用它制作的应用示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多