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



我浏览了很多不同的帖子,但找不到适合我的批处理脚本。我们有一个应用程序,它只输出一个名为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循环以,的通用delimeter对其进行拆分,然后将每个结果设置为一个变量,其中只有最后一个结果将作为最终结果存储:

@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%System32find.exe /I "%%G"<"P:athToSALES.csv">NUL 2>&1&&(Ren "P:athToSALES.csv" "SALES%%G.csv")||Echo %%G was not found.>"P:athTolog.txt"

如果没有将最终的echo写入名为log.txt的文件,请将最终"P:athTolog.txt"更改为CON(或完全删除>"P:athTolog.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并总是覆盖它,留下最后一个值。