Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Выбор рандомной папки в системе (http://forum.oszone.net/showthread.php?t=337566)

Darkar25 05-11-2018 16:55 2839444

Выбор рандомной папки в системе
 
я хочу сделать выбор рандомной точки в файловой системе 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 циклах...

Iska 05-11-2018 17:04 2839450

Что значит:
Цитата:

Цитата Darkar25
Выбор рандомной папки в системе »

Цитата:

Цитата Darkar25
выбор рандомной точки в файловой системе Windows »

?

Цитата:

Цитата Darkar25
но она не работает... »

Много ошибок.

Darkar25 05-11-2018 17:31 2839455

Цитата:

Цитата Iska
Что значит:
Цитата Darkar25:
Выбор рандомной папки в системе »
Цитата Darkar25:
выбор рандомной точки в файловой системе Windows »
? »

ну то и значит что нужно начиная с диска C выбирать рандомную папку до упора...тоесть к примеру текущий каталог C:\
бантик рандомно выдал папку test и перешел в неё C:\test
потом чекает если подпапок больше нет то выводит её в переменную...иначе снова выбирает рандомную папку но уже в папке test...к примеру он выбрал рандомную папку test12 и перешел неё C:\test\test12 и так далее...
UPD:
Примеры каталогов:
C:\

-temp
-users
-test
-program files
-system

C:\test

-test1
-test2
-test3
-test12
-test5
-test6

Iska 05-11-2018 18:49 2839461

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 2839462

Цитата:

Цитата Iska
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"(Разрешение отклонено) и не находится ли путь в корзине?

Iska 05-11-2018 19:31 2839476

Цитата:

Цитата Darkar25
UPD:а можно ещё как-то сделать проверку,не выдаёт ли скрипт "800A0046"(Разрешение отклонено) »

Что делать в этом случае?

Цитата:

Цитата Darkar25
и не находится ли путь в корзине? »

Что делать в этом случае?

Darkar25 05-11-2018 19:36 2839477

Цитата:

Цитата Iska
Что делать в этом случае? »

ну логично,запустить поиск заного...
Цитата:

Цитата Iska
Цитата Darkar25:
и не находится ли путь в корзине? »
Что делать в этом случае? »

ну и тут тоже... :3

Iska 05-11-2018 23:12 2839499

Давайте мы сделаем чуть по другому — вообще не будем трогать каталоги, имеющие атрибуты 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
'=============================================================================



Время: 09:28.

Время: 09:28.
© OSzone.net 2001-