2017-02-08 119 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

另請參閱[this answer](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

相關問題