首页 > 解决方案 > 使用批处理读取文件名

问题描述

我正在做一个新项目,我需要一些帮助。
我有一个脚本,我把它放在一起,效果很好,但想看看我们是否可以更新它

我需要帮助的是让批处理文件读取它自己文件名的 2 部分,并使用它来匹配和替换许多不同 .txt 文件的内容

这些是我的 bat 脚本名称,我制作了 100 多个单独的批处理脚本

(50) Kentucky.bat
(60) New_York.bat
(90) Texas.bat

我总共有 7 个不同的 .txt 文件,每个 txt 文件看起来像这样

cmmd.txt
   | Kentucky
   | New_York
   | Texas
   | Houston

这就是我设置脚本的方式,我对设置没问题,它可以满足需要

@echo off 
    setlocal enableextensions disabledelayedexpansion

    set "search=Kentucky"
    set "replace=50"
    
    set "SOURCE=%~dp0New Folder 1"
    
    set "textFile1=cmmd.txt"
    set "textFile2=cwab.txt"
    set "textFile3=ecbc.txt"
    set "textFile4=elic.txt"
    set "textFile5=tcpd.txt"
    set "textFile6=uadu.txt"
    set "textFile7=urdm.txt"

    for /f "delims=" %%i in ('type "%source%\%textFile1%" ^& break ^> "%source%\%textFile1%" ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>"%source%\%textFile1%" echo(!line:%search%=%replace%!
        endlocal
    )
    
    for /f "delims=" %%i in ('type "%source%\%textFile2%" ^& break ^> "%source%\%textFile2%" ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>"%source%\%textFile2%" echo(!line:%search%=%replace%!
        endlocal
    )
    
    for /f "delims=" %%i in ('type "%source%\%textFile3%" ^& break ^> "%source%\%textFile3%" ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>"%source%\%textFile3%" echo(!line:%search%=%replace%!
        endlocal
    )
    
    for /f "delims=" %%i in ('type "%source%\%textFile4%" ^& break ^> "%source%\%textFile4%" ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>"%source%\%textFile4%" echo(!line:%search%=%replace%!
        endlocal
    )
    
    for /f "delims=" %%i in ('type "%source%\%textFile5%" ^& break ^> "%source%\%textFile5%" ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>"%source%\%textFile5%" echo(!line:%search%=%replace%!
        endlocal
    )
    
    for /f "delims=" %%i in ('type "%source%\%textFile6%" ^& break ^> "%source%\%textFile6%" ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>"%source%\%textFile6%" echo(!line:%search%=%replace%!
        endlocal
    )
    
    for /f "delims=" %%i in ('type "%source%\%textFile7%" ^& break ^> "%source%\%textFile7%" ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>"%source%\%textFile7%" echo(!line:%search%=%replace%!
        endlocal
    )
    
    call "%~dp0\(60) New_York.bat"

所以这将是我运行第一个 .bat 并调用其余部分后的最终结果

cmmd.txt
   | 50
   | 60
   | 90
   | Houston

所以我想通过使用 .bat 文件的文件名而不是我编辑set "search=Kentucky"每个和set "replace=50"SearchReplace

如果您注意到我call在最后添加了一个并且效果很好,但是有没有一种方法可以让脚本调用下一个 .bat 文件,而无需我编辑每个 .bat 文件

如您所见,我按数字顺序命名文件,每个 .bat 将调用下一个 .bat 文件

(50) Kentucky.bat - this will call (60) New_York.bat
(60) New_York.bat - this will call (90) Texas.bat
(90) Texas.bat - the last one will not have a call

拥有这样的东西将有助于节省大量时间,因为我所要做的就是根据需要重命名 .bat 文件,仅此而已

我非常感谢您的帮助和所有的时间

同时我将继续制作我的 .bat 文件

标签: batch-file

解决方案


重复代码是不好的(容易出错且难以维护)。在需要的地方(代码不同的地方)合并和使用参数。这使您只剩下一个脚本和一个文本文件来维护替换参数,如下所示:

50,Kentucky
60,New_York
90,Texas

编码:

@echo off
setlocal
   REM get vars from csv
   for /f "usebackq tokens=1,2 delims=," %%a in ("replacements.csv") do call :replace "%%~a" "%%~b"
:: REM get vars from parameters
:: call :replace "%~1" "~2"

goto :eof
:replace 
REM replace in all matching files:
set "source=%~dp0New Folder"
for %%a in ("%source%\*.txt") do (
  for /f "delims=" %%i in ('type "%%a" ^& break ^> "%%a" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
      >>"%%a" echo(!line:%~2=%~1!
    endlocal
   )
)

如果您需要它,我提供了一种使用参数的方法(用 . 注释掉::。使用循环(读取文本文件)或类似参数for

replace.bat 20 "New Jersey"

(两种方法都支持空格)

有关修饰符和参数,for /?请参见。~<modifer><var>call /?%~<number>


推荐阅读