Показать полную графическую версию : [решено] Зависание виртуальной машины после запуска батника
ZeroCrash
01-07-2009, 21:59
Вот код батника, который через программу 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 (http://soft.mydiv.net/win/dlfile6daa_6262-VolumeID.html)
Я не знаю в чём причина, если виноват не батник и я разместил тему не в том разделе, то подскажите пожалуйста.
Пробежал глазками, не совсем понимаю необходимость такой сложности генерации метки тома, ну да ладно...
Попробуйте посмотреть следующее:
1. Основная часть программы просто вызывает Процедуру в 3й строке и выходит и скрипта.
Функция городит "серийник" для тома, устанавливает его и... выходит из скрипта вместо выхода из процедуры!
Насколько я помню, для выхода из процедуры необходимо использовать exit /b [code] вместо просто выхода.
Опять же (это ни в коей мере не мешает, но...) висят неиспользуемые процедуры dword, set и unset (последняя даже без выхода - просто конец скрипта)
2. Перечисление в цикле через запятую вроде отрабатывается корректно, но я бы не рисковал и заменил на пробелы (по-старинке).
3. Я не могу назвать нынешний интерпретатор батников достаточно устойчивым и адекватным. Все, что ему не нравится, но молча проглатывается, на мой взгляд "накапливается" и в какой-то момент вываливается непонятным багом, например, я одно время писал команды в скобках с отступом пробелом или более (для красоты), но в некоторых случаях я в результате получал ошибку выполнения комады, которой не было в скрипте вообще, а сама команда была всего лишь фрагментом содержимого одной из переменных. Поэтому будте более строги к оформлению.
ZeroCrash
12-07-2009, 22:45
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 Что делать???
Может генератор по-проще сделать?
Какой конечный внешний вид метки желателен, в смысле какие пожелания к цифрам на выходе - совершенно любая последовательность из 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
NiOl, буду пробовать твой код. Нужна последовательность: буква-цифра
Нужна последовательность: буква-цифра »
пжалста:
@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
NiOl,
1 c: %x-1%%y-1%%x-2%%y-2%-%x-3%%y-3%%x-4%%y-4%
1 это программа, которая меняет ID диска, мой код справлялся со своей задачей (подставить сгенерированный номер в прогу) а твой код этого не делает.
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
NiOl, батник работает, но проблема осталась не решенной. Виртуальная машина по прежнему виснет, а следовательно различий между мим батником и твоим нету, т.к. функциональность осталась прежней.
ZeroCrash, по ходу проблема не в батнике, а в "программе, которая меняет ID диска", вручную то хоть меняет?.. или подставьте перед командой замены оператор "@Echo " - вместо выполнения на экран будет выведен текст команды
ZeroCrash
16-07-2009, 10:16
amel27, попробовал вручную.....действительно виснет и без батника.....хотя раньше я в ручную делал и нечего не висло..... на реальной машине всё норм.....
ZeroCrash, тогда тебе в другую ветку... например, сюды: Microsoft Virtual PC (http://forum.oszone.net/showthread.php?t=105232)
ZeroCrash
16-07-2009, 11:07
amel27, у меня WMware стоит, ладно, крою тему. Всем спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.