batch-file - 使用批处理读取文件名
问题描述
我正在做一个新项目,我需要一些帮助。
我有一个脚本,我把它放在一起,效果很好,但想看看我们是否可以更新它
我需要帮助的是让批处理文件读取它自己文件名的 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"
Search
Replace
如果您注意到我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 文件
解决方案
重复代码是不好的(容易出错且难以维护)。在需要的地方(代码不同的地方)合并和使用参数。这使您只剩下一个脚本和一个文本文件来维护替换参数,如下所示:
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>
推荐阅读
- c++ - 如何在不同的 CMakeList.txt 之间共享变量?
- metadata - 如何读/写元数据?C++
- ios - 如何从 iOS Cordova 插件调用 Ionic 方法
- apache-kafka - Kafka 消费者 offsetForTimes 方法仅返回几个分区偏移位置不是全部
- python - PySimpleGui 输出标题栏名称问题
- mysql - 你知道如何在 mysql where 子句中包含和排除部分字符串吗?
- react-sortable-hoc - 当 lockToContainerEdges 为真时,为什么拖动的项目被隐藏?
- jquery - 当用户输入税款时,我正在尝试获取 g_total。到目前为止它没有返回任何值。到目前为止我已经尝试过这个东西
- javascript - 有效正则表达式的 Visual Studio Code 报告语法问题?
- python - python列表中缺少的项目