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 循环并获取找到的最后一个单词,然后重命名它。这是文件中唯一的一行吗? 不,有多行。但是,创建该文件时的所有行都将具有相同的最后一个单词。 当任何或所有记录中的最后一个字段包含一个另外两个字符串?即字符串 PREHAFLAEX 永远不会存在于任何文件中的任何位置,其记录结束字段包含字符串 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(或完全删除&gt;"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

代码注入行扩展为(因为它将每个, 替换为" &amp; 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批处理文件查找单词并重命名文件的主要内容,如果未能解决你的问题,请参考以下文章

bat批处理:根据文本文件批量重命名文件

批处理:批量重命名父文件夹下所有子文件夹里的文件

bat批处理文件夹下所有子文件夹下最后一个的文件重命名?

查找和重命名没有扩展名的文件?

查找相同图片并重命名

如何通过在 Windows 中使用批处理替换子字符串来重命名文件 [关闭]