PHP - Windows中的命令行参数

funde 发布于 2018-04-30 parameters 最后更新 2018-04-30 14:52 184 浏览

我试图从Windows XP下的命令行运行PHP。 这是有效的,除了我无法为我的PHP脚本提供参数。 我的测试用例:

echo "param = ".$param."\n";  
var_dump($argv);  
我想将其称为: php.exe -f test.php -- param=test 但我从来没有让剧本接受我的参数。 我从上面的脚本得到的结果 `PHP注意:未定义的变量:参数在第二行的C:\ test.php中
param = ''
array(2) {
  [0]=> string(8) "test.php"
  [1]=> string(10) "param=test"
}
我正在尝试使用PHP 5.2.6。 这是PHP5中的错误吗? 参数传递在online helpNote中处理:如果您需要将参数传递给脚本,则需要传递 - 作为使用-f开关时的第一个参数。 这似乎在PHP4下工作,但不在PHP5下。 在PHP4下,我可以使用可以在服务器上运行的相同脚本,而无需在命令行上进行修改。这对于本地调试非常方便,例如将输出保存在要研究的文件中。
已邀请:

aet

赞同来自:

为什么你有什么期望param将被设置为价值?您有责任以您想要的方式从$ argv数组解析命令行。

vvel

赞同来自:

$ argv是一个包含所有命令行参数的数组...您需要解析该数组并自己设置$ param。

$tmp = $argv[1];             // $tmp="param=test"
$tmp = explode("=", $tmp);   // $tmp=Array( 0 => param, 1 => test)
$param = $tmp[1];            // $param = "test";

oest

赞同来自:

PHP不会为您设置参数化命令行参数。查看ARGV中第二个输入是“param = test”的输出。 你最想要的是使用PEAR包http://pear.php.net/package/Console_CommandLine:“一个全功能的命令行选项和参数解析器”。 或者您可能会受到自虐,并添加代码以通过您的ARGV并自行设置参数。下面是一个非常简单的代码片段,让你开始使用(如果第一部分不是有效的变量名称,或者ARGV部分中存在超过1'=',这将不起作用:

foreach($argv as $v) {
    if(false !== strpos($v, '=')) {
        $parts = explode('=', $v);
        ${$parts[0]} = $parts[1];
    }
}

iaut

赞同来自:

你可以做一些事情:

if($argc > 1){
    if($argv[1] == 'param=test'){
        $param = 'test';
    }
}
当然,你可以根据需要变得更加复杂。

mut

赞同来自:

The parameter passing is handled in the online help Note: If you need to pass arguments to your scripts you need to pass -- as the first argument when using the -f switch. This seemed to be working under PHP4, but not under PHP5.
        但PHP仍然没有解析这些论点。它只是将它们传递给$ argv数组中的脚本。 这个唯一的原因是 - 让PHP可以知道哪些参数是针对PHP可执行文件的,哪些参数是针对您的脚本的。 这可以让你做这样的事情:
php -e -n -f myScript.php -- -f -n -e
( - 之后的-f,-n和-e传递给myScript.php,之前的传递给PHP本身)。

punde

赞同来自:

你可以使用$ argv数组。喜欢这个:

<?php
 echo  $argv[1];
?>
请记住,$ argv数组的第一个成员(即$ argv [0])是脚本本身的名称,所以为了使用应用程序的参数,您应该开始使用$ argv []的成员'1'指数。 在调用应用程序时,请使用以下语法:
php myscript.php -- myValue
没有必要为参数输入名称。正如你所看到的,你在$ argv []上调用了var_dump(),第二个成员(这是第一个参数)是字符串PARAM = TEST。对?所以不需要为该参数命名。只需输入参数值。

nut

赞同来自:

你可以使用类似的东西

if (isset($argv[1]) {
 $arg1 = $argv[1];             
 $arg1 = explode("=", $arg1);   
 $param = $arg1[1];            
}
(如何处理缺少参数取决于你) 或者如果您需要更复杂的场景,请查看命令行解析器库,例如Pear中的命令行解析器库。 使用另一个解决方案中发布的${$parts[0]} = $parts[1];,可以覆盖代码中的任何变量,这并不安全。

cet

赞同来自:

如果您喜欢靠尖端技术,PHP 5.3拥有getOpt()命令,它将为您处理所有这些混乱的业务。有些。

vomnis

赞同来自:

如果你想传递类似于GET变量的参数,那么你可以使用parse_str()函数。类似这样的东西:

<?php
parse_str($argv[1]);
?>
会产生一个值为myValue的$ test变量。 希望这可以帮助!

xipsam

赞同来自:

命令行示例: php myserver.php host = 192.168.1.4 port = 9000 在myserver.php中使用以下几行:

<?php
parse_str(implode('&', array_slice($argv, 1)), $_GET);
// Read Arguments
if (array_key_exists('host',$_GET))
{
    $host = $_GET['host'];
}
if (array_key_exists('port',$_GET))
{
    $port = $_GET['port'];
}
?>