Имя файла переменной пакетного файла: сделать имя файла временной метки внутри цикла for? - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь запустить пакет аудита Lighthouse из командной строки и вывести результаты в файлы JSON. Чтобы они не перезаписывали друг друга, каждое имя файла должно быть уникальным. Я хотел бы использовать метку времени в качестве имени файла в идеале. Я проходил через множество других вопросов стека по аналогичной теме, но не могу заставить это работать. В настоящее время я использую приведенный ниже код, написанный в пакетном файле и вызываемый из командной строки Windows:

SETLOCAL ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in (C:\Users\User\Desktop\Folder\Lighthouse_Project\urls.txt) DO (
    set dte=!DATE:/=-%!
    set tme=!TIME::=-%!
    set tme=!%tme:.=-%!
    ECHO Line is: %%a
    lighthouse %%a --quiet --chrome-flags=" --headless" --output=json --output-path=C:\Users\User\Desktop\Folder\Lighthouse_Project\json_logs\!dte!!tme!.json
)

Первый созданный файл имеет правильное имя, все последующие файлы JSON имеют буквальное имя: '! Dte !! Tme! ', и перезаписать друг друга. Если вы запускаете команду Lighthouse вне цикла for, она выполняется отлично, я знаю, что переменные не обновляются в цикле for, но я подумал! Var! может быть использовано для противодействия этому. Цикл for перебирает список URL-адресов, сохраненных в urls.txt, проверяя каждый из них по очереди и возвращая файл JSON.

Текущий результат: !dte!!tme!.json
Желаемый результат: 08-10-201913-55-12-07.json, 08-10-201913-56-14-00.json и т. Д.
Image demonstrating current file output

Если кто-нибудь знает, как изменить это для достижения правильного результата, я был бы очень признателен.

urls.txt содержит список URL-адресов, каждый на новой строке:

https://www.bbc.co.uk/weather/2643743
https://www.bbc.com/mundo
https://regex101.com/
https://www.bbc.co.uk/news

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Пример:

@Echo Off
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in (C:\Users\Owner\Desktop\Folder\Lighthouse_Project\urls.txt) DO (
set dte=!DATE:/=-!
set tme=!TIME::=-!
set tme=!tme:.=-!
ECHO Line is: %%a
echo lighthouse "%%a" --quiet --chrome-flags="--headless" --output=json --output-path="C:\Users\Owner\Desktop\Folder\Lighthouse_Project\json_logs\!dte!!tme!.json"
Timeout 2 >NUL
)
Timeout -1 >NUL

Используется точное содержание из вашего urls.txt примера. Я добавил @Echo Off вверху, чтобы уменьшить помехи на экране, и echo перед вашей командой lighthouse, чтобы она отображалась вместо прогонов. Кроме того, я включил пару timeout s для имитации короткого промежутка времени, (так как команда echo 'ed not run) , и чтобы дать вам возможность прочитать вывод наend.

Вот вывод из вышесказанного, чтобы доказать мою правоту:

Line is: https://www.bbc.co.uk/weather/2643743
lighthouse "https://www.bbc.co.uk/weather/2643743" --quiet --chrome-flags="--hea
dless" --output=json --output-path="C:\Users\Owner\Desktop\Folder\Lighthouse_Pro
ject\json_logs\08-10-201916-12-42-93.json"
Line is: https://www.bbc.com/mundo
lighthouse "https://www.bbc.com/mundo" --quiet --chrome-flags="--headless" --out
put=json --output-path="C:\Users\Owner\Desktop\Folder\Lighthouse_Project\json_lo
gs\08-10-201916-12-44-14.json"
Line is: https://regex101.com/
lighthouse "https://regex101.com/" --quiet --chrome-flags="--headless" --output=
json --output-path="C:\Users\Owner\Desktop\Folder\Lighthouse_Project\json_logs\0
8-10-201916-12-46-12.json"
Line is: https://www.bbc.co.uk/news
lighthouse "https://www.bbc.co.uk/news" --quiet --chrome-flags="--headless" --ou
tput=json --output-path="C:\Users\Owner\Desktop\Folder\Lighthouse_Project\json_l
ogs\08-10-201916-12-48-21.json"
Press any key to continue . . .

Ваша проблема, как было первоначально заявлено, заключалась в включении % символов в ваш первоначальный синтаксис setКак видно из приведенного вывода.

0 голосов
/ 08 октября 2019

Сохраняя расширение, не выходя из цикла, как вы и предполагали. Примечание. Я добавил здесь тайм-аут в миллисекунду, чтобы у нас каждый раз было другое время. ping 127.0.0.1 -n 1 -w 500> nul:

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (%userprofile%\Desktop\Croud_DS_1\Lighthouse_Project\urls.txt) DO (
     set dte=!date:/=-!
     set tme=!time::=-!
     set tme=!tme:.=-!
     set tme=!tme:,=-!
     echo Line is: %%a
     lighthouse "%%a" --quiet --chrome-flags=" --headless" --output=json --output-path=%userprofile%\Desktop\Folder\Lighthouse_Project\json_logs\!dte!_!tme!.json
     ping 127.0.0.1 -n 1 -w 500> nul
)

Обратите внимание, я позволил себе добавить подчеркивание, чтобы убедиться, что формат даты и времени читается, поэтому у вас будет YYYY-MM-dd_HH-mm-ss-ms

...