Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Выбор рандомной папки в системе

Ответить
Настройки темы
CMD/BAT - [решено] Выбор рандомной папки в системе

Пользователь


Сообщения: 103
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:55, 05-11-2018

 

Ветеран


Contributor


Сообщения: 23272
Благодарности: 6776

Профиль | Отправить PM | Цитировать


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

Цитата Darkar25:
но она не работает... »
Много ошибок.

Отправлено: 17:04, 05-11-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 103
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата 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

Последний раз редактировалось Darkar25, 05-11-2018 в 17:46.


Отправлено: 17:31, 05-11-2018 | #3


Ветеран


Contributor


Сообщения: 23272
Благодарности: 6776

Профиль | Отправить PM | Цитировать


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
'=============================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:49, 05-11-2018 | #4


Пользователь


Сообщения: 103
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось Darkar25, 05-11-2018 в 19:06.


Отправлено: 18:53, 05-11-2018 | #5


Ветеран


Contributor


Сообщения: 23272
Благодарности: 6776

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 19:31, 05-11-2018 | #6


Пользователь


Сообщения: 103
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 19:36, 05-11-2018 | #7


Ветеран


Contributor


Сообщения: 23272
Благодарности: 6776

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:12, 05-11-2018 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Выбор рандомной папки в системе

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Очистка папки %temp% у всех пользователей в системе. noxville Скриптовые языки администрирования Windows 14 17-07-2018 22:23
CMD/BAT - [решено] Выбор "рандомной" метки idlazarev_alex@vk Скриптовые языки администрирования Windows 3 19-04-2014 18:34
Установка - После удаления папки Windows.old - глюки в системе! Wusa Microsoft Windows 8 и 8.1 7 19-11-2013 17:51
.NET - Окно выбор папки ferget Программирование и базы данных 3 20-07-2011 07:01
Блог - Как задать значок для папки, чтобы он отображался в любой системе Vadikan Microsoft Windows 7 0 14-07-2011 09:30




 
Переход