#windows #batch-file #rename #findstr
#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 gt;Nul if %errorlevel%==0 ( ren SALES.CSV SALESFLAEX.CSV ) if %errorlevel%==1 ( echo "FLAEX" wasn't found within the Log.txt file! ) pause
У кого — нибудь есть лучший способ для этого?
Комментарии:
1. Вы должны использовать
for
цикл и взять последнее найденное слово, а затем переименовать его. Это единственная строка в файле?2. Нет, там несколько строк. Но все строки при создании этого файла будут иметь одно и то же последнее слово.
3. Возможно ли , что какая-либо из строк
PREHA
FLAEX
илиPWGEX
может существовать в других полях в любой записи, когда последнее поле в любой или всех записях содержит одну из двух других строк? то есть строкиPREHA
иFLAEX
никогда не будут существовать нигде в любом файле, в котором есть поле окончания записи, содержащее строкуPWGEX
и т. Д.4. Пожалуйста, обратите внимание, что два текущих ответа относятся к вашему вопросу, как и было задано. Если предполагалось, что ваш вопрос имел отношение к наличию нескольких файлов 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%System32find.exe /I "%%G"lt;"P:athToSALES.csv"gt;NUL 2gt;amp;1amp;amp;(Ren "P:athToSALES.csv" "SALES%%G.csv")||Echo %%G was not found.gt;"P:athTolog.txt"
Если вы не записываете финал echo
в файл с именем log.txt
, измените финал "P:athTolog.txt"
на CON
(или полностью удалите gt;"P:athTolog.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:,=" amp; set "LAST=%" rem // Actually rename the file, or report error if not possible: if defined LAST (ren "SALES.CSV" "SALES%LAST%.CSV") else gt;amp;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" amp; set "LAST=172225A" amp; set "LAST=11/18/21" amp; set "LAST=2655" amp; set "LAST=11/03/21" amp; set "LAST=11/25/21" amp; set "LAST=1100" amp; set "LAST=""" amp; set "LAST=1" amp; set "LAST=0" amp; set "LAST="Freight (Distance)"" amp; set "LAST=3100" amp; set "LAST=1" amp; set "LAST=-1578.5" amp; set "LAST=FLAEX"
который устанавливает переменную LAST
несколько раз и всегда перезаписывает ее, оставляя последнее значение.