Windows批处理文件查找单词并重命名文件
Posted
技术标签:
【中文标题】Windows批处理文件查找单词并重命名文件【英文标题】:Windows batch file to find a word and rename the file 【发布时间】:2022-01-07 10:37:13 【问题描述】:我浏览了许多不同的帖子,但找不到适合我的批处理脚本。我们有一个应用程序,它只输出一个名为 SALES.CSV 的文件。这是其中一行的样子:
DUNKAN,172225A,11/18/21,2655,11/03/21,11/25/21,1100,"",1,0,"Freight (Distance)",3100,1,-1578.5,FLAEX
取决于最后一个词是什么,这就是我需要命名文件的内容。对于这一行,文件将重命名为 SALESFLAEX.CSV。它们只是需要查找的几个不同的词:PREHA、FLAEX 和 PWGEX。这些词永远不会出现在同一个文件中。所以我只需要找到文件中当前存在的单词。 我确实找到了这段代码并对其进行了修改,但它只适用于一个文件。
findstr /m "FLAEX" SALES.CSV >Nul
if %errorlevel%==0 (
ren SALES.CSV SALESFLAEX.CSV
)
if %errorlevel%==1 (
echo "FLAEX" wasn't found within the Log.txt file!
)
pause
有没有人有更好的方法来解决这个问题?
【问题讨论】:
您必须使用for
循环并获取找到的最后一个单词,然后重命名它。这是文件中唯一的一行吗?
不,有多行。但是,创建该文件时的所有行都将具有相同的最后一个单词。
当任何或所有记录中的最后一个字段包含一个另外两个字符串?即字符串 PREHA
和 FLAEX
永远不会存在于任何文件中的任何位置,其记录结束字段包含字符串 PWGEX
等。
请注意,当前的两个答案是针对您提出的问题的。如果您的问题应该与拥有多个 CSV 文件并遍历它们有关,那么您应该在提交问题时这么说,并在尝试迭代和重命名这些文件时发布您尝试过的代码。
【参考方案1】:
有几种方法,一种是使用for /F
循环将文件内容读取为字符串,然后使用第二个for
循环将其拆分为常用分隔符,
,然后设置每个结果作为一个变量,只有最后一个结果将被存储为最终结果。:
@echo off
for /f "usebackq delims=" %%i in ("SALES.csv") do for %%a in (%%i) do set "last=%%~a"
ren "sales.csv" "sales%last%.csv"
【讨论】:
【参考方案2】:您现有的方法没有太大问题,我只是使用条件执行而不是错误级别:
@For %%G In (PREHA FLAEX PWGEX)Do @%SystemRoot%\System32\find.exe /I "%%G"<"P:\athTo\SALES.csv">NUL 2>&1&&(Ren "P:\athTo\SALES.csv" "SALES%%G.csv")||Echo %%G was not found.>"P:\athTo\log.txt"
如果您没有将最终的echo
写入名为log.txt
的文件,请将最终的"P:\athTo\log.txt"
更改为CON
,(或完全删除>"P:\athTo\log.txt"
)。也请记得根据需要修改P:\athTo\
【讨论】:
【参考方案3】:这是另一种方法:
rem // Read (last) line from file that ends with one of the desired words:
for /F "delims=" %%L in ('type "SALES.CSV" ^| findstr /E ",PREHA ,FLAEX ,PWGEX"') do set "LINE=%%L"
rem // Use code injection approach to extract the string behind the last `,`:
set "LINE=%LINE:,=" & set "LAST=%"
rem // Actually rename the file, or report error if not possible:
if defined LAST (ren "SALES.CSV" "SALES%LAST%.CSV") else >&2 echo ERROR!
根据您的示例字符串:
DUNKAN,172225A,11/18/21,2655,11/03/21,11/25/21,1100,"",1,0,"Freight (Distance)",3100,1,-1578.5,FLAEX
代码注入行扩展为(因为它将每个,
替换为" & set "LAST=
部分):
set "LINE=DUNKAN" & set "LAST=172225A" & set "LAST=11/18/21" & set "LAST=2655" & set "LAST=11/03/21" & set "LAST=11/25/21" & set "LAST=1100" & set "LAST=""" & set "LAST=1" & set "LAST=0" & set "LAST="Freight (Distance)"" & set "LAST=3100" & set "LAST=1" & set "LAST=-1578.5" & set "LAST=FLAEX"
多次设置变量LAST
并始终覆盖它,留下最后一个值。
【讨论】:
以上是关于Windows批处理文件查找单词并重命名文件的主要内容,如果未能解决你的问题,请参考以下文章