在PHP CLI脚本参数中传递路径

3
我是一名PHP CLI脚本的编写者,其中之一的参数是路径。
例如:
```php ```
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'

1
并且,如果您在变量中硬编码isdir($project_path),它是否有效?两个引用字符串对于常见的 shell 看起来都很合适。将它们传入变量后,变量内容看起来如何?否则,您可能仍然想要查看您的 argv 读取器。 - mario
你想在 PHP 中通过 $argv 变量访问该参数吗? - Tsanyo Tsanev
1
尝试像这样调用您的脚本 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,则一切正常。 - Tsanyo Tsanev
@TsanyoTsanev:问题不在于如何读取参数:请看我的更新。 - Andrea Sciamanna
@mario:你说得对。我没有注意到这个字符串实际上是转义的,如'/Volumes/Macintosh\ HD/Users/andrea/samples'。但我不知道如何取消转义。 - Andrea Sciamanna
你使用的是哪个版本的PHP?请检查魔术引号是否开启(http://php.net/manual/en/security.magicquotes.php)。另外,需要注意的是,反转义应该使用`stripslashes()`函数,但你必须确保这确实是你要做的事情。 - Tsanyo Tsanev
2个回答

0

简短回答:使用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);

示例命令行脚本:

#!/usr/bin/php
<?php

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

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

?>

实际上,我需要“取消转义”参数,因为脚本是从终端调用的:它们已经被转义了。 - Andrea Sciamanna
参数应该在脚本内部自动取消转义。Linux shell 会自动处理。您可以使用我的示例进行测试。 $_SERVER 变量保存未转义的参数。如果您真的需要一个取消转义函数,您可以使用 strtr() 编写它。重要的是要说,单引号和双引号有不同的含义。要取消转义单引号参数,只需使用 strtr() "\x27\x5C\x27\x27" => "\x27"。escapeshellarg() 创建单引号参数,所以该示例应该适用于您。要取消转义双引号参数,请搜索并找出哪些字符需要进行 strtr 转换。 - m4dm4x1337

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接