2015-05-26 159 views
0

目的是在Windows中使用批處理腳本在給定文本文件中隨機選擇一個包含文件夾列表的文件夾。從文本文件中的dir列表讀取文件路徑並將其作爲變量存儲在批處理腳本中Windows

循序漸進的方法:

  1. 輸入主目錄路徑
  2. 檢查當前驅動器號和更改驅動器號,以匹配主目錄驅動器,如果有必要
  3. 目錄更改到主目錄
  4. 寫目錄列表到主文件夾中的文本文件HOMEDIR.TXT
  5. 設置SKIP變量爲一個隨機數,直到該文本文件中的行數 一切正常了這一點
  6. 對於無定界符環(所以我得到的整條生產線),並跳過%SKIP%行數。然後從for循環設置VARNAME = %% I。然後轉到NextLine,所以它不會重複,直到文本文件的結尾。 ***此步驟給我錯誤:系統找不到指定的文件。

[編輯]在進一步的測試,錯誤僅發生IF%SKIP%> 4即,如果跳過對應於與在其上的文件路徑的線,它給出了錯誤。否則它工作正常。

我已經閱讀過所有的答案,但無法解決它!如果我將外部文件帶入隨機單詞的測試文件,它可以正常工作。所以我只能假設這是與導致問題的dir輸出列表中的特殊字符有關?任何幫助非常感謝!

我的代碼:

:: Make the code run quietly 
@ECHO OFF 

:: Get home directory 
set HOMEDIR=D:\External\My Pictures 

:: Switch to the drive of HOMEDIR 
:: If the drive letter of the current directory differs from HOMEDIR 
:: Then change drive letter 
:: Else change directory to root of that drive 
:: Thanks Jatrim for if not http://stackoverflow.com/questions/1421441/batch-not-equal-operator 
if not %cd:~0,2% == %HOMEDIR:~0,2% %HOMEDIR:~0,2% else cd %HOMEDIR:~0,2% 

:: Change directory to HOMEDIR 
cd "%HOMEDIR%" 

:: Write a list of the subdirectories of HOMEDIR to file homedir.txt 
dir "%cd%" /a:d >> homedir.txt 

:: Calculate how many lines there are in homedir.txt 
:: Thanks Aacini from http://stackoverflow.com/questions/13343144/random-line-of-text-ussing-batch 
for /F "" %%I in (homedir.txt) do set /a LINES=%%I 
echo LINES=%LINES% 

:: enable delayed expansion (needed???) 
setlocal EnableDelayedExpansion 

:: Set a random integer (within the limit of variable LINES) 
:: Thanks Aacini from http://stackoverflow.com/questions/13343144/random-line-of-text-ussing-batch 
set /a SKIP=%random%%%LINES% 
echo SKIP=%SKIP% 

:: In homedir.txt the first 5 lines aren't directories 
:: SKIP THESE LINES SOMEHOW 

:: Thanks Andriy M for the inspiration! http://stackoverflow.com/questions/6409869/echo-the-nth-line-from-a-text-file-where-n-is-a-command-line-argument 
:: If it's the same as SKIP, read line's contents into variable SCRDIR 

for /F "usebackq delims= skip=%SKIP%" %%I in (homedir.txt) do (if not defined SCRDIRORIG set SCRDIRORIG=%%I & GoTo :NextLine) 
pause 
:NextLine 
echo %SCRDIRORIG% 
pause 

回答

2

我會推薦這:

@echo off &setlocal disabledelayedexpansion 
    for /f "tokens=1*delims=:" %%a in ('findstr /n $ homedir.txt') do (
     set ".%%~a.=%%~b" 
     set /a DirCount=%%~a 
    ) 
    set /a DirCount-=5 
    set /a Sample=%random%%%DirCount 
    set /a Sample+=5 
    for /f "tokens=1*delims==" %%a in ('set ".%Sample%."') do echo %%~b 
+0

哇感謝Endoro!你的代碼是一個夢想:D 我唯一的問題是我不明白它......特別是「。%%〜a。= %%〜b」?我敢肯定,你可以看到我的代碼級別與你的代碼級別相去甚遠......我以前從來沒有用過findstr,也沒有使用過$操作符 - 但我確信我能弄清楚這些。這是。和〜「在for循環中與」「相結合,這將使我永遠呆在谷歌;) – jfgoodhew1

0

對於沒有臨時文件版本,你可以用

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "HOMEDIR=D:\External\My Pictures" 

    for /f "tokens=1,*" %%a in (' 
     cmd /q /v /c"for /d %%a in ("!HOMEDIR!\*") do (set /a "1000000000+(!random! * %random% %% (!random!+1^)^)" & echo(%%a)" 
     ^| sort 
     ^| cmd /q /v /c"(set /p "line^=" & echo(!line!)" 
    ') do set "SCRDIRORIG=%%b" 

    echo Folder selected : %SCRDIRORIG% 

嘗試的代碼創建一個cmd實例將列出所有指定起點下的隨機麻木前綴的文件夾呃。該列表已排序,然後檢索列表中的第一行。

所有這些都被封裝在for /f命令中,所以最後我們可以從文件夾名稱中分離開始的隨機數並設置變量。

0

我試着仔細選擇下面的代碼中的每一步的手段,以避免陷阱。

  1. 雖然改變爲HOMEDIR不在這裏絕對必要的話,最好用cd /d這改變了驅動器,以及在必要時進行。
  2. 文件夾列表可以快速創建,因此可以避免創建臨時文件。使用dir /b /ad不包括'。'和'..'也沒有像dir /ad這樣的路口。
  3. 對於計數,使用find /c結合對空字符串的否定搜索可直接生成計數,而無需進行復雜的提取(或循環)。
  4. 我們需要隨機數行跳過範圍0..nlines-1。一種方法是應用模運算符(%),但如果nlines爲0,則可能會失敗。因此使用替代方法。商%RANDOM%/32768在所需的範圍[0..1),所以我們只需要將它乘以nlines即可。
  5. 您必須測試零線才能跳過,否則FOR迴路將窒息skip=選項。
  6. 最後的FOR循環提取所需的行並立即停止GOTO。不好,但有效。

下面是代碼:

@echo off &setlocal enableextensions 

set "HOMEDIR=D:\External\My Pictures" 

cd /d %HOMEDIR% 
:: count the dirs 
for /f %%I in ('dir /b /ad "%HOMEDIR%"^| find /c /v ""') do set "nlines=%%I" 
:: pick a number from 0..nlines-1 
set /A nskip=%random% * %nlines%/32768 
:: discard "skip=" option if no lines to skip 
set skipopt= 
if %nskip% GTR 0 set skipopt=skip=%nskip% 
:: read line[nskip+1] from input and quit 
for /F "%skipopt% delims=" %%I in ('dir /b /ad %HOMEDIR%') do set "LINE=%%I" & GOTO :out 
:out 
echo folder selected : %LINE% 
相關問題