Изпълняване на .php скриптове вместо .vbs под Command Prompt?

[ UPDATED – 11.01.2009 ]

Почти съм убеден, че повечето от Вас, които пишете скриптове за управление/конфигуриране на компютри под Windows използват VBScript. Защо? Защото го има от мноооого отдавна, защото има купища информация за него в Интернет, заедно с безброй примерии защото е почти “прост” за използване … даже прекалено? Нека си признаем – като скриптов език не е нищо особено. Основните му предимства са три (според мен!):

  • вграден е в операционната система от Windows 95/98 насам;
  • лесно се инстанциират ActiveX/COM обекти (дефакто в това му е силата…но и слабото място);
  • подписване на скрипта с цифров сертификат (codeSigning);

А недостатъците…

  • не може лесно да се включи друг .vbs файл/библиотека с Ваши функции/процедури. В най-лесния вариант трябва да размножавате един и същи код във всеки нов .vbs файл.
    [http://www.source-code.biz/snippets/vbscript/5.htm ]
    [http://msdn.microsoft.com/en-us/library/342311f1(VS.85).aspx ]
  • бавен! Мисля, че това се дължи на факта, че VBScript е нетипизиран език, което е свързано с редица проверки от страна на интерпретатора. Подобно на типа Variant в Delphi:
    “…But use with care – there are penalties in performance, potentials for run time errors and poor code clarity when using Variants…” – [ http://www.delphibasics.co.uk/RTL.asp?Name=Variant]
  • тотална липса на вградена функционалност за елементарни неща, като:
    • директно извличане/изчисляване на милисекунди (налага се при някои SQL заявки)
    • хеш функции (имплементацията е ръчна.Пример MD5:[http://userpages.umbc.edu/~mabzug1/cs/md5/md5.asp ] )
    • други

т.е. налага се в сравнително прост скрипт от 10-20 реда да добавиш още 100 реда допълнителен код за реализиране на липсите.

Разбира се, можете да използвате ActiveX/COM обекти с подобна функционалност, но те обикновено са платени 😉

В такива моменти се замисляш: “Ееех, да беше поне като PHP…” 🙂

Предимството при PHP е необятната функционалност. В такава среда пишеш 10-те реда код, които ти трябват, за да свършиш работата, която искаш. Останалото се намира в десетките библиотеки, ти само го използвашт.е. не откриваш топлата вода 🙂 .

А защо да не използваме PHP скриптове под Command Prompt?!?

Много хора са свикнали да свързват PHP с Web страници и сървъри. И сигурно са прави -той е направен за това. Аз обаче ще се възползвам от една малко позабравена подробност. PHP идва в три варианта:

  • CGI php-cgi.exe –old style CGI вариант. Когато даден потребител отвори страницата index.php (примерно!) Web сървъра стартира php.exe и му подава необходимитепараметри през променливите на средата (environment variables)

[ http://en.wikipedia.org/wiki/Common_Gateway_Interface].

Следва обработва PHP кода и връщане резултантната страница, която потребителят вижда в Web браузъра си

  • CLI (Command Line Interpreter)php.exe/php-win.exe – изпълним конзолен файл. При подаване на пътя до .php файл като параметър през command prompt, php.exe го интерпретира и извежда резултата на стандартния изход.

Между другото, виждал съм много статии за това как да настроите IIS и PHPв CGI вариант, в които грешно сеизползва php.exe. И следват купчина коментари, че web страниците зависвали. И има защо. php.exe НЕ връща никакви хедъри, защото е CLI, а php-cgi.exe връща. Пример:

[code]D:\Programs\PHP>php-cgi.exe
еcho “Hello!”;

^Z

X-Powered-By: PHP/5.2.8
Content-type: text/html

Hello![/code]

А Вашият браузър изчаква заточно тези хедъри, последвани от празен ред, за да разбере какво точно му подава Web сървъра.”Изчаква”-нето на браузъра потребителят вижда като упоменатото забиване 🙂

Запомнихте ли? При IIS и PHP като CGI вариант използвайте php-cgi.exe 😉

  • ISAPI – обикновено .dll библиотека, която Web сървъра зарежда при стартирането си. Останалото е почти като при CGI варианта.

…изпълним конзолен файл…” и “…при подаване на пътя до .php файл като параметър…” – ключът от палатката!
Защо Web сървъра да може да стартира един файл и да му подава параметри, а аз да не мога? Мога разбира се! Дефакто правим същото при стартиране на .vbs файл:

cscript.exe someScript.vbs

Аналогията с PHP е пълна:

php.exe somePhpScript.php

Позволявам си да запиша php.exe без пълния път до него, защото съм си го добавил в променливата %path% на Windows, което всъщност си е задължително за нормалната му инсталация.
Ако искате да изпълнявате скриптовете си с конкретна версия/инсталация на php укажете пълния път при извикването на php.exe.

Ето какво имам предвид:

  • имам инсталирано PHP;
  • конфигуриралсъм коректно PHP-то;
  • направил съмси тестов PHP файл със следното съдържание:

[code]<?php
echo “Hello World!”;
?>[/code]

  • в Command Prompt записвам следното:

[code]php.exe e:\www\phpTestFile.php[/code]

Резултатът:

[singlepic=127]

Забравете HTML таговете в PHP сорса. Те няма да Ви трябват – все пак Command Prompt не е Web браузър 🙂

[Примерна задачка-закачка]:

[code]Да се изведат имената на файловете от папката C:\Dev-Cpp\bin иMD5 сумата на тяхното съдържание[/code]

Решението в 10 реда:

[code]<?
path = “C:\\Dev-Cpp\\bin\\”;
$dir_handle = @opendir($path) or die(“Unable to open $path”);
while ($file = readdir($dir_handle))
{
if (is_file($path.$file))
echo “FILE: “.strtoupper(md5_file($path.$file)).” | $file\n”;
}
closedir($dir_handle);
?>[/code]

Изпълнявам този php скрипт по познатия вече начин:

[code]php.exe e:\www\fileList.php[/code]

И в прозореца на Command Prompt виждам резултата:

[singlepic=128]

Страхотийка – хем цъкаш PHP за Web, хем за скриптинг 🙂

Както сЪ вика: От всеки Web-ер ->script-ер 🙂 🙂 🙂

Неудобството при използване на този подход е, че трябва предварително да инсталирате PHP на компютрите, където ще изпълнявате .php скриптовете. Вариантите са няколко:

  • Сваляте си php.xyz.installer.msi и го разпространявате по машините чрез групова политика или SMS (Software Management Server)
  • Сваляте си само архив на PHP (без инсталатор), разархивирате го и го разпространявате с добрите стари и верни .CMD или.VBS скриптове:)

Текуща версия на PHP в двата варианта (ZIP и MSI) можете да намерите тук: [http://www.php.net/downloads.php ]

“The power is yours … use it!”

2 thoughts on “Изпълняване на .php скриптове вместо .vbs под Command Prompt?

  1. Интересна статийка 🙂
    Разгледах и инфо в Интернет…Благодаря Ви за линковете
    Забелязах и идейките за използването на`php -r`
    Интересна е опцийката -r примерче( и не само това 🙂 ) за използване 🙂
    % php -r ‘echo “Hello teacher!\n”;’
    Hello teacher!
    Ето и една бърза математическа закачка:
    % php -r ‘echo sqrt(150).”\n”;’
    12.247448713916

    Може ли да намерим колко седмици има в годината?!?!
    %$ php -r ‘echo date(“W”) . “\n”;’
    26
    Може да разберем кога се пада и 24 май 🙂
    % php -r ‘echo date(“l”, strtotime(“2009-05-24”)) . “\n”;’
    🙂 🙂 🙂

    Може ли да генерираме и случаен номер за изпитване в училище 🙂 :Л) 🙂
    % php -r ‘echo rand(0, 100) . “\n”;’
    38

    Та такива ми ти работи
    Още веднъж благодаря за статията и подсещането !!!!
    Лек, доходен ден и за вас

  2. Случайно попаднах на този пост реших да се занимая с малко апологетика на vbs/wsh/js
    Не е проблем да се включи код с външен файл ако се използва .wsf файл – https://msdn.microsoft.com/en-us/subscriptions/downloads/15x4407c(v=vs.84).aspx – дори е възможно включването на jscript (!) код (който в повечето случаи предпочитам – най -голямото предимство на vbscript e подаването по референция – http://webcoder.info/reference/vbsvsjs.html).С jscript могат да се адресират и проблемите с времето в милисекунди,скороста и донякъде hash функции.Колкото до checksums единственият вграден алгоритъм в Windows e с командата MAKECAB (но не е MD5) – все пак по-малък “разход” е ползването на външен скрипт отколкото инсталирането на нов скриптов език .Също доста ползвана е хибридизацията с .bат файлове – http://www.dostips.com/forum/viewtopic.php?p=33963 . (което може да стане лесно и с php стига да позволява изпълнението на файл с разширение различно от .php) .

    Въпреки ,че вече си има powershell който скоро ще стане единственият смислен скриптов език под уиндоус.

Leave a Reply

Your email address will not be published. Required fields are marked *