Показать полную графическую версию : [решено] Выбор рандомной папки в системе
Darkar25
05-11-2018, 16:55
я хочу сделать выбор рандомной точки в файловой системе Windows с помощью CMD...
у меня была вот эта наготовка но она не работает...
setlocal enableextensions enabledelayedexpansion
set "folder = C:\"
:dig
set /a n=0
for /f "UseBackQ Delims=[" %%A IN (dir "%folder%" /D) do (
set /a n+=1
)
If "%n%"=="0" (goto start)
RND 0 %n% num
set /a c=0
for /f "UseBackQ Delims=[" %%A IN (dir "%folder%" /D) do (
strlen length %%A
set /a c+=1
if !c!==%num% set "folder=%folder%!%%A:~0,length-1!"
)
goto dig
:start
echo %folder%
pause
:RND
set MIN=%1
set MAX=%2
SET /A %3=%MIN%+(%MAX%-%MIN%+1)*%random%/32768
:strlen <resultVar> <stringVar>
(
setlocal EnableDelayedExpansion
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
)
(
endlocal
set "%~1=%len%"
exit /b
)
не могу понять в чем дело...вроде всё верно сделано...но может быть дело в циклах...т.к я не до конца представляю себе как работает делитель в for циклах...
Что значит:
Выбор рандомной папки в системе »
выбор рандомной точки в файловой системе Windows »
?
но она не работает... »
Много ошибок.
Darkar25
05-11-2018, 17:31
Что значит:
Цитата Darkar25:
Выбор рандомной папки в системе »
Цитата Darkar25:
выбор рандомной точки в файловой системе Windows »
? »
ну то и значит что нужно начиная с диска C выбирать рандомную папку до упора...тоесть к примеру текущий каталог C:\
бантик рандомно выдал папку test и перешел в неё C:\test
потом чекает если подпапок больше нет то выводит её в переменную...иначе снова выбирает рандомную папку но уже в папке test...к примеру он выбрал рандомную папку test12 и перешел неё C:\test\test12 и так далее...
UPD:
Примеры каталогов:
-temp
-users
-test
-program files
-system
-test1
-test2
-test3
-test12
-test5
-test6
Darkar25, ясно. А почему только на одном разделе, и почему именно c:?
На WSH (пакетные файлы на коротком промежутке времени исполнения не дают реально псевдослучайных значений):
Option Explicit
Dim strRootFolder
Dim objFSO
Randomize Timer
strRootFolder = "c:\"
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strRootFolder) Then
WScript.Echo ScanSubFolders(objFSO.GetFolder(strRootFolder))
Else
WScript.Echo "Can't find root folder [" & strRootFolder & "]."
WScript.Quit 1
End If
Set objFSO = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Function ScanSubFolders(objFolder)
Dim objSubFolder
Dim intSubFoldersCount
Dim intRandom
Dim intCount
intSubFoldersCount = objFolder.SubFolders.Count
If intSubFoldersCount > 0 Then
intRandom = Int(intSubFoldersCount * Rnd() + 1)
intCount = 0
For Each objSubFolder In objFolder.SubFolders
intCount = intCount + 1
If intCount = intRandom Then
Exit For
End If
Next
ScanSubFolders = ScanSubFolders(objSubFolder)
Else
ScanSubFolders = objFolder.Path
End If
End Function
'=============================================================================
Darkar25
05-11-2018, 18:53
Option Explicit
Dim strRootFolder
Dim objFSO
Randomize Timer
strRootFolder = "c:\"
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strRootFolder) Then
WScript.Echo ScanSubFolders(objFSO.GetFolder(strRootFolder))
Else
WScript.Echo "Can't find root folder [" & strRootFolder & "]."
WScript.Quit 1
End If
Set objFSO = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Function ScanSubFolders(objFolder)
Dim objSubFolder
Dim intSubFoldersCount
Dim intRandom
Dim intCount
intSubFoldersCount = objFolder.SubFolders.Count
If intSubFoldersCount > 0 Then
intRandom = Int(intSubFoldersCount * Rnd() + 1)
intCount = 0
For Each objSubFolder In objFolder.SubFolders
intCount = intCount + 1
If intCount = intRandom Then
Exit For
End If
Next
ScanSubFolders = ScanSubFolders(objSubFolder)
Else
ScanSubFolders = objFolder.Path
End If
End Function
'============================================================================= »
спасибо,оно работает)))
UPD:а можно ещё как-то сделать проверку,не выдаёт ли скрипт "800A0046"(Разрешение отклонено) и не находится ли путь в корзине?
UPD:а можно ещё как-то сделать проверку,не выдаёт ли скрипт "800A0046"(Разрешение отклонено) »
Что делать в этом случае?
и не находится ли путь в корзине? »
Что делать в этом случае?
Darkar25
05-11-2018, 19:36
Что делать в этом случае? »
ну логично,запустить поиск заного...
Цитата Darkar25:
и не находится ли путь в корзине? »
Что делать в этом случае? »
ну и тут тоже... :3
Давайте мы сделаем чуть по другому — вообще не будем трогать каталоги, имеющие атрибуты Hidden и System:
Option Explicit
Const Hidden = 2
Const System = 4
Dim strRootFolder
Dim objFSO
Randomize Timer
strRootFolder = "c:\"
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strRootFolder) Then
WScript.Echo ScanSubFolders(objFSO.GetFolder(strRootFolder))
Else
WScript.Echo "Can't find root folder [" & strRootFolder & "]."
WScript.Quit 1
End If
Set objFSO = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Function ScanSubFolders(objFolder)
Dim objSubFolder
Dim intCount
With WScript.CreateObject("Scripting.Dictionary")
intCount = 0
For Each objSubFolder In objFolder.SubFolders
If Not objSubFolder.Attributes And (Hidden Or System) Then
intCount = intCount + 1
.Add intCount, objSubFolder
End If
Next
If .Count > 0 Then
ScanSubFolders = ScanSubFolders(.Items()(Int(.Count * Rnd())))
Else
ScanSubFolders = objFolder.Path
End If
.RemoveAll
End With
End Function
'=============================================================================
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.