Может не правильный вопрос, но таки: как в виндавс с командной строки создать или редактировать переменую окружения?
**** mvenv.cmd ********* Код (Text): SET key=%1 SET value=%2 SET %key%=%value% Скопируй этот файл в системную директорию. Теперь можешь запускать : Код (Text): с:\> mvenv myvar,1 // Помещаем в myvar единицу c:\> echo %myvar% // выведет единицу на экран. ... c:\> mvenv abc,%myvar% // Извлекаем из myvar и помещаем в abc. Теперь abc=1
лучше очистить key, value, после использования Код (Text): SET key=%1 SET value=%2 SET %key%=%value% SET key= SET value=
n0name Не учел. ... можно было просто SET %1=%2 PS.: Мне нравится, что ./mvenv через запятую работает: MVENV A,B синтаксис знакомый)) --------- Тут можно еще досоображать: Реализовать на PHP или Shell такие вещи как stack и команды в винду pop и push. Также можно додумать простейшие арифметические операции... На PHP можно даже операции со сдвигом разработать... а предварительно описать: GLOBAL a,b,c,d; // GLOBAL asciistr; // Для скорости можно работать не с самими значениями переменных, а суказателями на их адрес, пересылая данные в a, b, c или d.
n0name Зацени: Код (Text): <?php GLOBAL $a,$b,$c,$d; GLOBAL $Source_Index, $Destination_Index, $LI; GLOBAL $ARX; GLOBAL $SA; $ARX[0]=null; $SA[0]=null; function mvenv ($where, $from){ $GLOBALS["$where"]=$from; } function mvenvl ($where, $from){ $GLOBALS["$where"]=$GLOBALS["$from"]; } function addr ($index){ return $GLOBALS["ARX"][$index]; } function _str($val){ $cnt = count ($GLOBALS["ARX"]); $re = $cnt+1; $GLOBALS["ARX"][$cnt]=$val; } function push ($what){ $cnt = count ($GLOBALS["SA"]); $re = $cnt+1; $GLOBALS["SA"][$re]=$what; } function inl(){ $GLOBALS["LI"]=count($GLOBALS["SA"]); } function pop ($where){ $cn = $GLOBALS["LI"]; $GLOBALS["$where"]=$GLOBALS["SA"][$cn]; } $key = "My VALUE!!!"; _str ("hello, worldxxx!"); _str ("\n"); _str ("world hello!!!"); _str ($key); mvenv ("a", addr (1)); echo $GLOBALS["a"]; mvenv ("a", addr (2)); echo $GLOBALS["a"]; mvenv ("a", addr (3)); echo $GLOBALS["a"]; push (addr(4)); inl(); echo $GLOBALS["LI"]; $value=null; pop ($GLOBALS["Destination_Index"]); mvenvl ("a", "Destination_Index"); echo $GLOBALS["a"]; ?>
IceStudent А что? В начале файла - #!/usr/bin/php Потом - chmod +x myfile.php -- Главное, чтобы работало.
device Ну как по мне - рнр для другого предназначен. Да и под виндой полноценного шелл-скриптинга не получится - только сегодня провозился, пытаясь заставить работать команды "echo hello | script.pl". Так и не получилось - пришлось переписать как ехе. Хотя если кто подскажет более удобное решение, чем "echo hello | perl fullpath/to/script.pl", я был бы весьма благодарен. P.S. под bash всё работает. P.-P.S. скрипты зарегистрированы в реестре как command=perl.exe "%1" %*
IceStudent Я на PHP инсталлеры даже пишу (self-extract bz2 архив). Поставь систему TopSERVER 2.0. У тебя будет в винде: /usr/bin/perl это раз, а два - если ты не юзаешь bash (win-реализацию), то пропиши: command=perl.exe "%1" (так по крайней мере у меня записано) Но при запуске скриптов, действительно требуются абсолютные пути. Вряд ли их можно обойти. Единственный вариант - писать cmd-файлы. Самый оптимальный вариант.
Возьми предыдущий листинг (#7) и назови его libstdscript. Дальше напиши следующую прогу: Код (Text): require ("libstdscript"); // Объявим строки _str ( "Starting script..." ); _str ( $_SERVER["argv"][1]); //Полный путь к скрипту _str ( $_SERVER["argv"][2]); // имя исполняемого файла _str ("c:\\usr\\bin\\perl.exe"); //путь к интерпретатору _str ($_SERVER["argc"]); mvenv ("a", addr (4)); // Сохраняем путь к перлу в "a"; mvenv ("b", addr (2)); // Сохраняем путь к скрипту в "b"; inl(); //Обнуляем счетчики (LI) $cmdx=sha1("com"); mvenv ("Source_Index", "SET $cmdx=".$GLOBALS["a"]."\t".$GLOBALS["b"]."\t".$_SERVER["argv"][3]."\n%$cmdx%\n$cmdx="); push ($GLOBALS["Source_Index"]); function nop(){} addr (5)>=2 ? nop(): die ("Usage: **** "); $op = fopen (addr(3).".cmd", "w"); fwrite ($op, addr(1)."\n".$GLOBALS["LI"][1]); fclose ($op); Сохрани это как perlc команда: perlc c:\my\script.pl script создаст тебе исполняемый файл "script" -- ему точно никаких путе прописывать не надо!))
device А если на target-машине его не будет? Что это даст? Путь к перлу, как в никсах? Я и так его могу сделать, толку-то. Юзаю, в нём всё ок. Тогда дополнительные аргументы не будут передаваться, а мою проблему всё равно не решит. Для меня самый оптимальный вариант - делать как делал, а специфичные, но часто востребованные случаи переписывать в ехе А если какое-то выражение надо использовать раз-два, то набрать "bash" перед этим не так уж и трудно P.S. А рнр у меня нет.
Это проблемы target-пользователя Кто сказал, что не будут???? Параметры cmdline (1) Лежат в argv[1]!!! Код (Text): split ("\t", argv[1]); //Не забывай про парсинг
Я говорю. Код (Text): #perl -w print scalar @ARGV; Регистрируешь скрипт как ты сказал и пробуешь: Код (Text): >script.pl 1 2 3 0 Разумеется, если написать "perl script.pl" 1 2 3, то всё ок, но такой вариант не устраивает, т.к. обычно я вообще пишу просто "script 1 2 3".
[offtop text=" Как работает программа link.exe в win32??? Не могу сообразить, кав винде вообще возможно создавать ссылки на файлы! " /]
Надеюсь, Вы коммерческими разработками не занимаетесь? Уж очень дилетантский подход. А если пользователь по принципиальным (идейным) соображениям, ни за что не захочет ставить PHP? (у меня его тоже нет, и не появится)
Линкер что ли? Знаю junction, ln (обе для создания символических ссылок на директории), cp -l (для жесткой ссылки между файлами). Или тебя интересует, как они работают? Так NTFS поддерживает это. Не знаю, как в FAT.