2017-02-08 2 views
1

Я работаю над исполняемым скриптом Windows. Я нашел способ установить переменную в случайную строку из текстового файла. Это кусок, который начинается с строки 4 и эха !current_proxy!.Получите случайную строку из текстового файла в пакете Windows

Я попытался скопировать этот фрагмент в другой раздел командного файла (раздел с большим пустым пространством вокруг него), чтобы я мог получить другую случайную строку, если/когда определенный файл не загружается. Почему он не работает на этот раз? Использую ли я неправильные символы (например, % и !)? Благодарю.

@echo off 
setlocal EnableDelayedExpansion 

set proxies_list="proxies.txt" 

:: # Count the number of lines in the text file and generate a random number. 
for /f "usebackq" %%c in (`find /V /C "" ^< %proxies_list%`) do set lines=%%c 
set /a random_number=%RANDOM% * lines/32768 + 1, skiplines=random_number-1 

:: # Extract the line from the file. 
set skip= 
if %skiplines% gtr 0 set skip=skip=%skiplines% 
for /f "usebackq %skip% delims=" %%c in (%proxies_list%) do set "current_proxy=%%c" & goto continue 
:continue 

echo/!current_proxy! 



for %%a in (xml\*.xml) do (

    for /l %%b in (0,1,337) do (

     set /a "x=%%b%%26" 
     set /a "y=%%b/26" 
     set /a "tile_number=%%b+1" 

     if not exist "C:\Users\User\Desktop\panoid\tiles\%%~na\%%~na_tile!tile_number!.jpg" (

     echo C:^\Users^\User^\Desktop^\panoid^\tiles^\%%~na^\%%~na_tile!tile_number!.jpg 
     "C:\Portable programs\wget64.exe" --read-timeout=10 --tries=3 -e use_proxy=on -e http_proxy=!current_proxy! -O "C:\Users\User\Desktop\panoid\tiles\%%~na\%%~na_tile!tile_number!.jpg" "http://updatethis.com" 


     FOR /F "usebackq" %%d IN ("C:\Users\User\Desktop\panoid\tiles\%%~na\%%~na_tile!tile_number!.jpg") DO set size=%%~zd 

     if !size! GTR 0 (
      echo File not empty. 
     ) ELSE (
      echo File empty. 






      for /f "usebackq" %%c in (`find /V /C "" ^< %proxies_list%`) do set lines=%%c 
      set /a random_number=%RANDOM% * lines/32768 + 1, skiplines=random_number-1 
      set skip= 
      if %skiplines% gtr 0 set skip=skip=%skiplines% 
      for /f "usebackq %skip% delims=" %%c in (%proxies_list%) do set "current_proxy=%%c" & goto continue 
      :continue 
      echo/!current_proxy! 






     ) 


    ) 
    ) 
) 

pause 
+0

Каждая переменная, которая изменяется внутри заключенного в скобки блока кода, должна считываться с использованием замедленного расширения (например, '! Skiplines!', '! Skip!' И '! RANDOM!'). ** Но: ** Отсроченное расширение не может использоваться в строке опций для 'for/F', поэтому'! Skip! 'Там не работает; поэтому вы должны переместить цикл 'for/F' в подпрограмму; вы можете предоставить '! skip!' в качестве аргумента и получить доступ к нему как '% 1' в подпрограмме, которая работает в строке опций' for/F' ... – aschipfl

+0

См. также [этот ответ] (http : //stackoverflow.com/a/39653402) ... – aschipfl

ответ

0

Вот пример, чтобы показать вам, что Call :label может помочь.

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

@Echo Off 

Set "proxlist=proxies.txt" 

For /F "Tokens=1* Delims=:" %%a In ('FindStr/N "^" "%proxlist%"') Do (
    Set "line[%%a]=%%b" 
    Set "total=%%a" 
) 

Call :SetRand 
Echo=%randline% 

Call :SetRand 
Echo=%randline% 

Call :SetRand 
Echo=%randline% 

Timeout -1 
Exit/B 

:SetRand 
Set/A "rand=(%RANDOM%%%total)+1" 
Call Set "randline=%%line[%rand%]%%" 

Всякий раз, когда вам нужна другая случайная строка просто вызовите раздел вашего сценария, который делает это, и вернуться в точку только после команды Call.

+0

Почему эта пауза («Нажмите любую клавишу, чтобы продолжить ...») после каждого эха? – grgoelyk

+0

Это не так, он приостанавливается один раз с использованием 'timeout' после вывода трех случайных строк. – Compo

+0

О, это было потому, что я поставил «паузу» в качестве последней строки. Это работает сейчас. Я удалил код «Timeout -1» и «Exit/B». Мне также пришлось переместить последние три строки в конец всего моего скрипта партии, иначе это не сработает. Благодарю. – grgoelyk

Смежные вопросы