Windows批处理文件查找单词并重命名文件

Windows batch file to find a word and rename the file

我浏览了许多不同的帖子,但找不到适合我的批处理脚本。我们有一个应用程序只输出一个名为 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 /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"

你现有的方法没有太大问题,我只是使用条件执行而不是错误级别:

@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\

这是另一种方法:

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 并始终覆盖它,留下最后一个值。