Пакетный скрипт: как переместить и заменить существующий файл - PullRequest
0 голосов
/ 25 июня 2019

Моя задача - найти строку «WebDriver Sampler» из файла sss_output.csv, сохранить результаты во временном файле tmp.csv.

Затем переместите файл tmp.csv для замены существующего файла sss_output.csv.

Вот мой код:

call findstr /C:"WebDriver Sampler" sss_output.csv > tmp.csv
call move /Y tmp.csv sss_output.csv

Проблема, с которой я сталкиваюсь, заключается в том, что если файл sss_output.csv существует, то данные из файла tmp.csv будут добавлены в файл sss_output.csv.

Я хочу, чтобы данные из tmp.csv заменяли данные в sss_output.csv.

Как я могу это сделать?

1 Ответ

0 голосов
/ 25 июня 2019

Нет необходимости вызывать Findstr, вам нужно только вызывать асинхронные процессы, которые вы хотите дождаться завершения, прежде чем продолжить, или вы вызываете метку в сценарии cmd, это не повредит ни с какой вероятностью, но может просто удалите этот бит, так как он не нужен.

Так что это будет означать:

FindStr /I /C:"WebDriver Sampler" sss_output.csv > tmp.csv
MOVE /Y tmp.csv sss_output.csv

Хотя Move "должен" перезаписать файл Я также сталкивался с таким поведением в прошлом, когда выполнял необходимые операции в цикле, поскольку казалось, что процесс все еще удерживает файл открытым и вызывает меня добавить.

Итак, если ничто не удерживает открытый файл, просто удалите его.

IE:

( FindStr /C:"WebDriver Sampler" "sss_output.csv" > "tmp.csv" )
IF NOT EXIST "tmp.csv" ( COLOR CF & ECHO.ERROR WE DID NOT CREATE THE TEMP FILE! The String was not Matched!) ELSE ( ( DEL /F/Q sss_output.csv && MOVE /Y "tmp.csv" "sss_output.csv"  ) || ( COLOR E0 & ECHO.SOMETHING CAUSED US NOT TO BE ABLE TO DELETE THE FILE OR THE File COuld Not be copied! ) )

Если существует процесс, удерживающий его открытым или файл «всегда должен существовать» по какой-либо другой причине, тогда вы можете просто Заменить содержимое содержимым из tmp.csv на Type вместо этого в исходный файл.

IE:

( FindStr /I /C:"WebDriver Sampler" "sss_output.csv" > "tmp.csv" )
IF NOT EXIST "tmp.csv" ( COLOR CF & ECHO(ERROR WE DID NOT CREATE THE TEMP FILE! The String was not Matched!) ELSE ( ( Type "tmp.csv" > "sss_output.csv" && DEL /F/Q "tmp.csv"  ) || ( COLOR B0 & ECHO(SOMETHING CAUSED US NOT TO BE ABLE TO WRITE TO THE FILE ) )

Вышеприведенное будет выводить одну совпадающую строку во временный файл, а затем, если это было успешно (то есть совпадение было найдено в первую очередь), оно заменит содержимое исходного файла содержимым временного файла. , Если это прошло успешно, он удалит временный файл.

Кроме того, этот метод будет делать то же самое без создания временного файла:

FOR /F "Tokens=*" %%A IN ('FindStr /I /C:"WebDriver Sampler" "sss_output.csv"') DO @(
   SET "_Line=%%A" & DIR 1>&0 2>NUL 
)
IF DEFINED _Line (
   ECHO(%_LINE%>"sss_output.csv"
   COLOR A0
   ECHO(We Found this Line and tried to write it to the file:
   ECHO(%_LINE%
) ELSE (
   COLOR CF
   ECHO(ERROR: The String was not Matched!
)

Я использую DIR 1>&0, чтобы рано выйти из цикла. (Раньше я использовал echo.hello>&3, но нахожу DIR 1>&0 работает более последовательно)

Я изменил их в отдельных строках, чтобы мы не полагались на && s, который может держать файл открытым с предыдущего шага.

Я проверяю, создан ли временный файл (что, если нет, то мы не соответствовали строке или у нас не было разрешения на создание временного файла). Я также проверяю, соответствовали ли мы строке в временном файле. Безфайловый метод (как я всегда был), но во всех случаях я выводил некоторый диалог и изменял цвет шрифта в зависимости от того, на каком этапе он терпит неудачу.

Посмотрите, что получилось в результате, пожалуйста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...