我浏览了很多不同的帖子,但找不到适合我的批处理脚本。我们有一个应用程序,它只输出一个名为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
并总是覆盖它,留下最后一个值。