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