php - передать переменные в скрипт Windows .bat? - PullRequest
0 голосов
/ 16 сентября 2011

Мне нужно запустить скрипт .bat из PHP.Сценарий .bat должен содержать имена файлов, которые являются переменными PHP.Как бы я поступил так внутри PHP?

Спасибо!

Ответы [ 4 ]

1 голос
/ 16 сентября 2011

Используйте fopen(), fwrite() и fclose() для создания файла .bat, затем используйте shell_exec() для его выполнения. Смотрите здесь:

fopen: http://us3.php.net/manual/en/function.fopen.php

fwrite: http://us3.php.net/manual/en/function.fwrite.php

fclose: http://us3.php.net/manual/en/function.fclose.php

shell_exec: http://php.net/manual/en/function.shell-exec.php

=============================================== ==================================

EDIT: Или, если всегда передается одинаковое количество переменных php, и они скалярные, вы можете просто создать один файл .bat, который принимает параметры командной строки, а затем передать скалярные переменные в shell_exec.

0 голосов
/ 10 октября 2018

Чтобы расширить ответ Джонатана, вам не нужно выполнять командный файл с PHP.Вы также можете использовать PHP только для создания командного файла конфигурации.Затем вы можете вызвать это в своем пакетном файле, чтобы получить доступ ко всем необходимым переменным.Это очень гибко, и хранение переменных в отдельном пакетном файле сохраняет ваш основной код в чистоте.

Для иллюстрации вам понадобятся три файла:

  1. batch.bat Ваш основной пакетфайл
  2. setup.php Генератор конфигурации
  3. config.bat Пакетный файл конфигурации (созданный setup.php)

Генератор конфигурации

* 1018Прежде всего, мы создадим скрипт setup.php, который генерирует файл config.bat.Это может выглядеть так:
// Create a list of all variable names we want
// to use in the bat file, with their values.
// Note that these can come from anywhere - from
// a database, other files, remote API calls, etc.
$batVariables = array(
    'InfoFile' => 'info.txt',
    'TrackListing' => 'tracklist.txt',
    'AuthorBio' => 'author.txt',
    'MainTrack' => 'audio.mp3'
);

// create the code for the configuration
// batch file.
$batCode = 
'@echo off'.PHP_EOL.
':: AUTOMATICALLY GENERATED FILE, DO NOT EDIT'.PHP_EOL.
PHP_EOL;

// add all variables
foreach($batVariables as $varName => $value) 
{
    $batCode .= 'set '.$varName.'='.$value.PHP_EOL;
}

// save the configuration file
file_put_contents('config.bat', $batCode);

Это создаст командный файл, который выглядит следующим образом:

@echo off
:: AUTOMATICALLY GENERATED FILE, DO NOT EDIT

set InfoFile=info.txt
set TrackListing=tracklist.txt
set AuthorBio=author.txt
set MainTrack=audio.mp3

Загрузить конфигурацию

Далее, добавьте эти две строкив вашем пакетном файле (вы должны будете убедиться, что исполняемый файл php доступен в вашей системной переменной PATH):

:: Generate the configuration batch file
php setup.php

:: Load the configuration with all variables
call config.bat

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

При загрузке config.bat с помощью команды call переменные будут доступны непосредственно в области действия основного пакетного файла.Это означает, что вы можете начать использовать их как обычно, например, так:

echo Using the information file %InfoFile%.

Помимо этого, вы можете добавить несколько проверок ошибок в случае, если файл конфигурации не может быть сгенерирован.Один простой способ - убедиться, что файл существует:

IF EXIST "config.bat" (
    call "config.bat"
) ELSE (
    echo The configuration file does not exist.
    echo.
    pause
    exit
)
0 голосов
/ 16 сентября 2011

Если ваш bat-файл просто принимает имя файла и некоторые базовые параметры, то вы просто используете shell_exec () с правильными параметрами.

На параметры командной строки пакетного файла ссылаются% 1% 2и т.д., если ваш пакетный файл foo.bat и содержит:

notepad.exe %1

, вы можете вызвать foo.bat textfile.txt из командной строки.php, вы строите свою командную строку как строку, а затем вызываете shell_exec, используя ее

0 голосов
/ 16 сентября 2011

Передача переменной с одного языка программирования на другой? Нет, пока указанный язык не поддерживает аргумент, если он есть (и есть), используйте его (передавайте переменные по аргументу)

...