【问题标题】:Passing a path in a PHP CLI script argument在 PHP CLI 脚本参数中传递路径
【发布时间】:2013-08-13 19:51:48
【问题描述】:

我正在编写一个 php CLI 脚本,该脚本接受路径等参数。

所以一个例子是:

php myscript.php -p=/Volumes/Macintosh HD/Users/andrea/samples

脚本有自己的方法来红色参数,它正确地获取 -p 的值,将它设置在一个名为 $project_path 的变量中。

但是,当我使用 isdir($project_path) 测试文件夹时,它返回 false。

我尝试以不同的方式传递路径:

  • /Volumes/Macintosh\HD/Users/andrea/samples
  • '/Volumes/Macintosh HD/Users/andrea/samples'
  • “/Volumes/Macintosh HD/Users/andrea/samples”
  • '/Volumes/Macintosh\HD/Users/andrea/samples'
  • "/Volumes/Macintosh\HD/Users/andrea/samples"

它们都不起作用。 我必须使用什么格式才能使其工作? 请考虑该脚本还必须在不同的操作系统(即 Windows)上运行。

问题是路径参数被自动转义: 我需要摆脱它。 返回的字符串是:

\'/Volumes/Macintosh\HD/Users/andrea/samples\'

【问题讨论】:

  • 如果您在变量中硬编码isdir($project_path) 是否有效?对于普通的 shell,任何一个带引号的字符串看起来都很好。传入后的变量内容如何?否则,您可能仍想查看您的 argv 阅读器。
  • 您希望能够通过 php 中的 $argv 变量访问该参数?
  • 尝试像 php -f myscript.php -- -p=/Volumes/Macintosh\ HD/Users/andrea/samples 这样调用你的脚本。 -- 将告诉 php 可执行文件,它的参数列表已经结束,之后的所有内容都应该传递给 PHP 文件。在 myscript.php 的开头执行 var_dump($argv); exit(); 并检查脚本中的内容。如果 $argv 的索引 1 是 -p=/Volumes/Macintosh\ HD/Users/andrea/samples 你很好。
  • @TsanyoTsanev:问题不在于如何阅读参数:请参阅我的更新。
  • @mario:你是对的。我没有注意到该字符串实际上被转义为 \'/Volumes/Macintosh\\HD/Users/andrea/samples\' 我不知道如何取消转义。

标签: php command-line-interface


【解决方案1】:

简答:使用escapeshellarg()

长答案:

chmod +x yourscript.php

-

$path = '/Volumes/Macintosh HD/Users/andrea/samples';
$cmdline = sprintf('/home/user/yourscript.php -p=%s 2>&1', escapeshellarg($path));
$output = shell_exec($cmdline);

示例 cli 脚本:

#!/usr/bin/php
<?php

fwrite(STDOUT, print_r($_SERVER, TRUE));

exit(0); // exit with exit code 0

?>

【讨论】:

  • 实际上我需要“取消转义”参数,因为脚本是从终端调用的:它们已经被转义了。
  • 参数应该在你的脚本中自动转义。 linux shell 就是这样做的。你可以用我的例子来测试它。 $_SERVER 变量保存未转义的参数。如果你真的需要一个 unescape 函数,你可以使用 strtr() 来编写它。重要的是要说单引号和双引号具有不同的含义。要取消转义单引号参数,只需 strtr() "\x27\x5C\x27\x27" => "\x27"。 escapeshellarg() 创建单引号参数,因此该示例应该适合您。要取消转义双引号参数,请查看 google 并找出需要 strtr'ed 的字符。
【解决方案2】:

我最终使用getopt() 来获取未转义的参数(我不知道为什么会有这种差异)并使用str_replace( array( "'", '"'), '', $file_path ); 来删除包装引号。

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 2014-08-12
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多