Пакетный файл Windows, чтобы найти слово и переименовать файл

#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 несколько раз и всегда перезаписывает ее, оставляя последнее значение.