Компьютерный форум 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=143967)

ZeroCrash 01-07-2009 21:59 1156770

Зависание виртуальной машины после запуска батника
 
Вот код батника, который через программу VolumeID меняет ID логического диска:
Код:

@echo off
setlocal enabledelayedexpansion
call:1
goto:eof
:1
for %%i in (1,2,3,4) do (
for %%j in (a,f,d,e,c) do set x_%%i_!random!=%%j
for %%j in (1,2,3,4) do set y_%%i_!random!=%%j
)
for %%i in (1,2,3,4) do (
for /f "tokens=4 delims=_=" %%j in ('set x_%%i') do set x-%%i=%%j
for /f "tokens=4 delims=_=" %%j in ('set y_%%i') do set y-%%i=%%j
)
VolumeID c: %x-1%%y-1%%x-2%%y-2%-%x-3%%y-3%%x-4%%y-4%
goto:eof
:dword
for /f "tokens=2 delims==" %%i in ('set l_1') do set "a=%%i"
for /f "tokens=2 delims==" %%i in ('set l_2') do set "b=%%i"
 
set "dword=%dword%%a%%b%"
 
for /f "tokens=1 delims==" %%i in ('set l_') do set "%%i="
goto:eof

:set
set "value_%random%=%~1"
goto:eof

:unset
for /f "tokens=1 delims==" %%i in ('set value_') do set "%%i="

При его запуске ID меняется, но система полностью виснет либо сразу, либо при попытке каких-либо действий.
При запуске на моём компе всё работает нормально.
Вот ссылка на прогу: VolumeID
Я не знаю в чём причина, если виноват не батник и я разместил тему не в том разделе, то подскажите пожалуйста.

NiOl 08-07-2009 13:46 1161994

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

Попробуйте посмотреть следующее:

1. Основная часть программы просто вызывает Процедуру в 3й строке и выходит и скрипта.
Функция городит "серийник" для тома, устанавливает его и... выходит из скрипта вместо выхода из процедуры!
Насколько я помню, для выхода из процедуры необходимо использовать exit /b [code] вместо просто выхода.
Опять же (это ни в коей мере не мешает, но...) висят неиспользуемые процедуры dword, set и unset (последняя даже без выхода - просто конец скрипта)

2. Перечисление в цикле через запятую вроде отрабатывается корректно, но я бы не рисковал и заменил на пробелы (по-старинке).

3. Я не могу назвать нынешний интерпретатор батников достаточно устойчивым и адекватным. Все, что ему не нравится, но молча проглатывается, на мой взгляд "накапливается" и в какой-то момент вываливается непонятным багом, например, я одно время писал команды в скобках с отступом пробелом или более (для красоты), но в некоторых случаях я в результате получал ошибку выполнения комады, которой не было в скрипте вообще, а сама команда была всего лишь фрагментом содержимого одной из переменных. Поэтому будте более строги к оформлению.

ZeroCrash 12-07-2009 22:45 1165843

Код:

setlocal enabledelayedexpansion
for %%i in (1,2,3,4) do (
    for %%j in (a,f,d,e,c) do set x_%%i_!random!=%%j
    for %%j in (1,2,3,4) do set y_%%i_!random!=%%j
)
 
for %%i in (1,2,3,4) do (
    for /f "tokens=4 delims=_=" %%j in ('set x_%%i') do set x-%%i=%%j
    for /f "tokens=4 delims=_=" %%j in ('set y_%%i') do set y-%%i=%%j
)
1 c: %x-1%%y-1%%x-2%%y-2%-%x-3%%y-3%%x-4%%y-4%

Вот такой код работает, но только на моей машине. А после запуска на виртуальной, после его выполнения винда на вирте виснет. Если убрать setlocal enabledelayedexpansion, то всё норм работает, но значение всегда с4с4-с4с4 Что делать???

NiOl 13-07-2009 12:27 1166229

Может генератор по-проще сделать?
Какой конечный внешний вид метки желателен, в смысле какие пожелания к цифрам на выходе - совершенно любая последовательность из 4 байт?
Попробуй так:

@Echo off
SetLocal EnableDelayedExpansion
SetLocal EnableExtensions

set VL=
set HEX=0123456789ABCDEF
for /L %%n in (1,1,8) do (
set /A "C=!random! & 15"
call set C=%%HEX:~!C!,1%%
set VL=!VL!!C!
if %%n==4 set VL=!VL!-
)
echo %VL%

ZeroCrash 13-07-2009 18:49 1166623

NiOl, буду пробовать твой код. Нужна последовательность: буква-цифра

NiOl 13-07-2009 19:12 1166643

Цитата:

Цитата ZeroCrash
Нужна последовательность: буква-цифра »

пжалста:
Код:

@Echo off
SetLocal EnableDelayedExpansion
SetLocal EnableExtensions

set VL=
set HEX=ABCDEF
for /L %%n in (1,1,4) do (
set /A N=!random!
set /A "C=!N!-((!N!/6)*6)"
call set VL=!VL!%%HEX:~!C!,1%%%%N:~-1%%
if %%n==2 set VL=!VL!-
)
echo %VL%


ZeroCrash 15-07-2009 20:59 1168713

NiOl,
Код:

1 c: %x-1%%y-1%%x-2%%y-2%-%x-3%%y-3%%x-4%%y-4%
1 это программа, которая меняет ID диска, мой код справлялся со своей задачей (подставить сгенерированный номер в прогу) а твой код этого не делает.

NiOl 15-07-2009 21:21 1168734

Цитата:

Цитата ZeroCrash
1 это программа, которая меняет ID диска, мой код справлялся со своей задачей (подставить сгенерированный номер в прогу) а твой код этого не делает. »

Прошу уточнить один момент - я выложил 2 пакетных файла, которые только генерят и показывают переменную %VL%, без дисковых операций.

В первом случае это будет полностью случайная последовательность вида (3 запуска дали мне следующие последовательности):
1734-2655
E7DE-121B
F3E7-B563


Во втором - последовательности с учетом пожеланий (буква-цифра):
A6B9-C8E2
D9D7-C4F7
D3D5-E8D5


Все, что нужно - в конце пакетного файла вывод на экран echo %VL% заменить на VolumeID c: %VL%
Дело в том, что у меня этой проги (VolumeID) нет и я в примерах просто вывел результат на экран, никаких операций над диском не производя.

т.е. в чистом виде мои батники метку диска менять не станут. Нужно добавить ВАШУ команду к конец каждого пакетного файла, как в примере выше.

ZeroCrash 15-07-2009 23:06 1168816

NiOl, батник работает, но проблема осталась не решенной. Виртуальная машина по прежнему виснет, а следовательно различий между мим батником и твоим нету, т.к. функциональность осталась прежней.

amel27 16-07-2009 03:07 1168967

ZeroCrash, по ходу проблема не в батнике, а в "программе, которая меняет ID диска", вручную то хоть меняет?.. или подставьте перед командой замены оператор "@Echo " - вместо выполнения на экран будет выведен текст команды

ZeroCrash 16-07-2009 10:16 1169107

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

amel27 16-07-2009 10:51 1169168

ZeroCrash, тогда тебе в другую ветку... например, сюды: Microsoft Virtual PC

ZeroCrash 16-07-2009 11:07 1169191

amel27, у меня WMware стоит, ладно, крою тему. Всем спасибо!


Время: 15:27.

Время: 15:27.
© OSzone.net 2001-