Пакетный файл для открытия одного из списка URL - PullRequest
1 голос
/ 29 августа 2009

У меня есть список сайтов. Я хочу, чтобы пакетный файл открывал только первый веб-сайт в списке, когда я запускаю bat-файл в первый раз, и когда я запускаю пакетный файл во второй раз, он открывает только второй веб-сайт в списке и когда я выполняю его для третьего раз он откроет только третий сайт в списке и так далее. Кто-то предложил мне следующее решение:

@echo off & setLocal EnableDELAYedExpansion

if not exist %TEMP%\runnum echo 1> %TEMP%\runnum
set /p R=<%TEMP%\runnum
set N=

for /f "tokens=* delims= " %%a in (myfile) do (
set /a N+=1
if !N! equ !R! echo firefox %%a blabla
)
set /a R+=1
echo !R!> %TEMP%\runnum

Но я не знаю, что он имел в виду под (myfile) и blabla, потому что я ничего не знаю о сценариях или программировании. Может кто-нибудь помочь мне в дальнейшем. Предполагая, что мой список сайтов:

http://meebo.com
http://yahoo.com
http://google.com
http://orkut.com
http://facebook.com
http://msn.com
http://cnn.com
http://myspace.com
http://twitter.com

Ответы [ 4 ]

5 голосов
/ 29 августа 2009

Это на самом деле не так сложно. myfile становится именем файла, в котором вы храните список URL-адресов, а blabla - просто дополнительные параметры, передаваемые в Firefox.

Хотя есть несколько моментов, которые можно улучшить:

  • Полагаться на Firefox - не самая лучшая вещь. Я бы предложил использовать

    start "" "%%a"
    

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

  • Ваш пакет не будет выполнен, когда будет достигнуто количество веб-сайтов в вашем файле, и, возможно, просто появится новое окно Firefox. Ниже я создал пакет, который устраняет обе проблемы:

    @echo off
    setlocal enableextensions
    rem fetch the first URL
    set /p URL=<list.txt
    rem Open the browser with that URL
    start "" "%URL%"
    rem Remove the URL from the front of the file ...
    more +1 list.txt | findstr /r /v "^$" > tmp_list.txt
    rem ... and put it to the end
    echo.%URL%>>tmp_list.txt
    del list.txt
    ren tmp_list.txt list.txt
    endlocal
    

Эта версия не зависит от конкретного браузера. Он просто свернет сам файл, удалив первый URL и снова прикрепив его к концу. Так что, пока у вас есть URL-файл (в нашем случае list.txt), он в значительной степени автономен. Код можно найти и в моем SVN-репозитории .

ETA: Объяснение некоторых частей этой партии:

set /p URL=<list.txt

Это будет первая строка в list.txt, которая будет сохранена в переменной окружения URL. Обычно set /p запрашивает ввод данных пользователем. Перенаправляя файл в эту команду, мы в основном делаем вид, что содержимое файла было введено пользователем.

start "" "%URL%"

откроет веб-страницу, документ, папку, что угодно. start делает The Right Thing ™ автоматически (в основном :)). Если мы дадим ему URL, он откроет браузер по умолчанию с ним, что мы и используем здесь. Две кавычки вокруг URL гарантируют, что символы, такие как & в URL, будут правильно передаваться в браузер, в противном случае они имеют особое значение. К сожалению, две кавычки, следующие сразу за start, необходимы при использовании кавычек с start. В противном случае start будет интерпретировать URL как заголовок окна для нового окна консоли, что может быть не совсем тем, что мы здесь хотим.

more +1 list.txt | findstr /r /v "^$" > tmp_list.txt

У этого есть несколько частей. Прежде всего more +1 вызывает вывод файла, пропуская первую строку. Как мы помним, первая строка - это первый URL, который мы хотели открыть (что уже должно было произойти). Мы хотим удалить этот URL-адрес из начала файла и поместить его в конец. Итак, первый шаг - удалить его с самого начала, что и делает more +1 list.txt здесь.

Тогда все, что напечатано more, передается в findstr. findstr - это удобная утилита для поиска строк. Здесь мы включаем регулярные выражения с /r (своего рода инструмент мечты программистов для обработки текста - если бы они могли, они писали бы полные программы в регулярных выражениях, но я отвлекся). Тогда /v заставляет findstr печатать каждую строку , а не , соответствующую тому, что мы указали после этого. Шаблон, который мы ищем здесь, это "^$", который просто-напросто говорит "пустая строка".

Таким образом, в одной строке мы удаляем первую строку из файла и удаляем из него все пустые строки. (Эти пустые строки приводят к тому, что командный файл делает странные вещи. Помните, что start делает в основном правильной вещью? Это один из таких случаев. Пустая строка в вашем файле может вызвать окно проводника с вашим вместо браузера с следующей веб-страницей должна появиться текущая папка. Поэтому нам нужно избавиться от них.)

Наконец, мы записываем все эти команды в новый файл, который называется tmp_list.txt. Не волнуйтесь, это не задержится слишком долго.

echo.%URL%>>tmp_list.txt

Добавляет только что открытый URL в наш временный список. Ничего необычного здесь не происходит.

del list.txt
ren tmp_list.txt list.txt

Наконец мы удаляем старый список и снова переименовываем временный в старое имя.

ETA: Поскольку вы запросили версию, которая может открывать несколько страниц за один раз, ниже следует быстрый и грязный хак, который включает только это:

@echo off
setlocal enableextensions
set num=3
for /l %%i in (1,1,%num%) do call :start
endlocal
goto :eof

:start
set /p URL=<list.txt
start "" "%URL%"
more +1 list.txt | findstr /r /v "^$" > tmp_list.txt
echo.%URL%>>tmp_list.txt
del list.txt
ren tmp_list.txt list.txt
goto :eof

На этот раз длинных объяснений нет. Этот пост уже достаточно длинный. Вы можете контролировать количество открываемых страниц, изменяя переменную num в верхней части файла.

set num=5

приведет к открытию пяти страниц вместо трех.

2 голосов
/ 18 июля 2013

Расширено "грязным хаком" Ventero, чтобы получить строки в текстовом файле, чтобы перебрать весь текстовый файл, открывая их, а затем заканчивая. Работает как шарм

@echo off
setlocal enableextensions
setlocal EnableDelayedExpansion
set "cmd=findstr /R /N "^^" Give.txt | find /C ":""

for /f %%a in ('!cmd!') do set number=%%a

set num=%number%
for /l %%i in (1,1,%num%) do call :start
endlocal
goto :eof

:start
set /p URL=<Give.txt
start "" "%URL%"
more +1 Give.txt | findstr /r /v "^$" > tmp_list.txt
echo.%URL%>>tmp_list.txt
del Give.txt
ren tmp_list.txt Give.txt
goto :eof

Жаль, что кто-то еще сделал это и опубликовал это, так что я буду этим кем-то другим =)

1 голос
/ 10 ноября 2009

Я только что нашел старый choice.com, который не поддерживал / D и / T одинаково:

 rem  older versions of choice may need:  choice /N /Ty,7 > nul:

Просто используйте choice /? , если сомневаетесь:)

1 голос
/ 28 октября 2009

Спасибо

У меня был URL с пробелом (% 20), и мне действительно нужно было:
start "" "(URL with space)"

Кроме того, я обнаружил, что если IE не был загружен, он игнорировал бы жестко закодированный список в моем пакетном файле во время загрузки, в результате чего фактически работал только один URL из списка. Задержка после первого запуска работает хорошо:

 rem  allow IE to load, otherwise it will only show 1 URL   
 rem  N=Nothing shown  D=default (Y for Y/N)  T=timeout (7 sec)  
@choice /N /D Y /T 7 > nul:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...