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

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

Ответить
Настройки темы
CMD/BAT - Выбрать случайные символы.

Новый участник


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

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


Среда win xp.
Задано несколько символов.
Допустим '1,5,8,3,s,h,n'
Нужно случайным образом выбрать три из них.
Повторения допускаются.

Отправлено: 21:24, 30-03-2017

 

Ветеран


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

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


Скрытый текст
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sValues=1,5,8,3,s,h,n

for /l %%i in (1, 1, 20) do (
	call :GetRandom
	call :GetValue !Random! %sValues%
	echo [!Value!]
)

endlocal
exit /b 0

:GetRandom
	setlocal enableextensions enabledelayedexpansion
	set sOut=%~0
	
	for /f "usebackq delims=" %%i in (
		`mshta.exe "javascript:new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Math.floor(Math.random() * 7).toString());close();" 1 ^| more`
	) do (
		set /a iRandom = %%i
	)
	
	endlocal & set %sOut:~4%=%iRandom%
	exit /b

:GetValue
	setlocal enableextensions enabledelayedexpansion
	set sOut=%~0

	set /a iCount = %~1
	for /l %%i in (1, 1, %iCount%) do shift /2
	set sValue=%~2
	
	endlocal & set %sOut:~4%=%sValue%
	exit /b

Для демонстрации выбирается двадцать значений, замените на потребное Вам «3». Псевдослучайное значение генерируется JScript-кодом посредством mshta.exe.

Отправлено: 22:10, 30-03-2017 | #2



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

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


Новый участник


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

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


Похоже под xp не работает:
Код: Выделить весь код
"Application Data"call :GetRandom
""Application Data"call" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Отправлено: 06:04, 31-03-2017 | #3


Ветеран


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

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


Откуда там «"Application Data"»? Проверьте, правильно ли Вы скопировали код.

Отправлено: 06:54, 31-03-2017 | #4


Ветеран


Contributor


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

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


Чистый CMD
Код: Выделить весь код
@Echo Off
cls
Set "Symb=abcdefghijklmno"
Set /A "NOut=3"

SetLocal EnableExtensions EnableDelayedExpansion

Set /A NSymb=-1
FOR /L %%i IN (0,1,20) DO (
	Call Set "ii=%%Symb:~%%i,1%%"
	If Not "!ii!"=="" Set NSymb=%%i
)
Set /A NSymb+=1

:Begin
Set "SOut="
FOR /L %%j IN (1,1,%NOut%) DO (
	FOR /L %%i IN (1,1,100) DO Set /a rnd=!random!
	Set "rnd=000!rnd!"
	Set /A rnd=1!rnd:~-3!-1000
	Set /A rnd=%NSymb%*!rnd!/999
	Call Set "rnd=%%Symb:~!rnd!,1%%" 
	Set "Sout=!Sout!!rnd!"
)
Echo %Sout%

pause >nul
GoTo :Begin

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 15:44, 31-03-2017 | #5


Забанен


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

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


megaloman, Вы явно усложняете:
Код: Выделить весь код
@echo off
  setlocal enabledelayedexpansion
    set "map=1583shn"
    set "i=0"
    :loop
      set /a "i+=1", "j=7*%random%/32767"
      set "r=!r!!map:~%j%,1!"
      if !i! neq 3 goto:loop
    echo:%r%
  endlocal
exit /b

Отправлено: 16:56, 01-04-2017 | #6


Новый участник


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

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


Уверены, что это должно работать на голой xp sp3?
У меня не завелись оба варианта.
Код: Выделить весь код
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

C:\Documents and Settings\name>C:\1.bat

C:\Documents and Settings\name>setlocal enabledelayedexpansion

C:\Documents and Settings\name>set "map=1583shn"

C:\Documents and Settings\name>set "i=0"

C:\Documents and Settings\name>set /a "i+=1", "j=7*1144/32767"

C:\Documents and Settings\name>set "r=!r!!map:~0,1!"

C:\Documents and Settings\name>if !i! NEQ 3 goto:loop

C:\Documents and Settings\name>set /a "i+=1", "j=7*32076/32767"

C:\Documents and Settings\name>set "r=!r!!map:~6,1!"

C:\Documents and Settings\name>if !i! NEQ 3 goto:loop

C:\Documents and Settings\name>set /a "i+=1", "j=7*26214/32767"

C:\Documents and Settings\name>set "r=!r!!map:~5,1!"

C:\Documents and Settings\name>if !i! NEQ 3 goto:loop

C:\Documents and Settings\name>echo:1nh
1nh

C:\Documents and Settings\name>endlocal
Вариант от megaloman выводит много раз "Set /a rnd=!random!" прежде чем вывести 3 рандомных символа дважды 'Echo gie
gie'.

Отправлено: 17:25, 01-04-2017 | #7


Забанен


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

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


Цитата neth1:
Уверены, что это должно работать на голой xp sp3?
Да хоть на одетой, ибо в ней сие и писалось. И потом:
Цитата neth1:
Допустим '1,5,8,3,s,h,n'
Нужно случайным образом выбрать три из них.
Повторения допускаются.
Если Вы не обратили внимание, то:
Цитата neth1:
...
C:\Documents and Settings\name>echo:1nh
1nh
...
Это и есть три рандомных символа из Вашего же условия задачи. Или Вам как-то нужно эти символы особым образом сохранять, скажем, в массив?

Отправлено: 17:38, 01-04-2017 | #8


Ветеран


Contributor


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

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


neth1, А в начале кода у Вас присутствует @Echo off? Иначе объяснить отображение команд на экране невозможно.
greg zakharov, Возможно, Вы частично правы, но я стремлюсь делать более обобщенные скрипты, у Вас же при изменении длины набора символов и длины случайного слова придётся перелопатить весь код. Мне показалось, что вариант с однократным для каждого символа определением *%random%/32767 часто даёт серию близких значений, возможно я неправ. И, наконец, в Вашем коде имхо логичнее применить For
Код: Выделить весь код
FOR /L %%i IN (1,1,3) DO (
	Set /A j=7*!random!/32767
        call set "r=!r!%%map:~!j!,1%%"
)

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 01-04-2017 в 18:19.


Отправлено: 18:11, 01-04-2017 | #9


Ветеран


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

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


neth1, может быть Вы озвучите Вашу глобальную цель — зачем это надо?

Отправлено: 18:53, 01-04-2017 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Случайные зависания компьютера. Nasitrap Непонятные проблемы с Железом 12 29-09-2015 09:39
[решено] Случайные зависания компьютера daniil98797 Материнские платы и память 9 03-11-2013 13:50
Delphi - [решено] Случайные числа Ruzik Программирование и базы данных 5 13-11-2008 08:22
Разное - [решено] Как в список "Символы" добавить собственные символы для вставки в текст T-IIIJ Microsoft Windows 2000/XP 4 23-02-2008 16:27
Случайные числа на JavaScript Dimonweb Вебмастеру 2 12-08-2004 03:23




 
Переход