从PHP执行时,在WinSCP命令行中转义空格

时间:2012-12-27 16:10:41

标签: php command-line exec winscp

我有一个应该是一个简单的问题。我试图在PHP中执行下面的代码。此代码的目标是使用名为WinSCP的程序将文件从一个文件夹上传到FTP中的另一个文件夹。

exec("C:\\xampp\\winscp.com backup /command \"option confirm off\" \"put C:\\big boy\\Documents\\dev notes\\\" \"exit\"");

文件没有被转移,我认为我遇到的问题是因为我的目录中有big boydev notes所在的空格。我尝试在另一个双引号之间加入:

C:\\big boy\\Documents\\dev notes\\\

但它不起作用。

2 个答案:

答案 0 :(得分:3)

让我们先关闭一下吧。以下一行:

exec("C:\\xampp\\upload.exe backup /command \"option confirm off\" \"put C:\\big boy\\Documents\\dev notes\\\" \"exit\"");

你主要对命令的实际字符串感兴趣,让我们重新编写它:

C:\xampp\upload.exe backup /command "option confirm off" ⤦ 
⤥"put C:\big boy\Documents\dev notes\" "exit"

因为它现在应该显而易见,所以这不是shell中的有效命令。请参阅upload.exe的文档,其格式必须是/command开关的值。

由于您没有提供upload.exe的任何参考,我不能在此提出更具体的建议。但是,处理这些问题的一种常用方法是首先将命令分配给变量然后执行它。这允许显示调试信息,然后可以轻松解决问题:

$command = "C:\\xampp\\upload.exe backup /command \"option confirm off\" \"put C:\\big boy\\Documents\\dev notes\\\" \"exit\"";
exec($command);

可能只是(只是猜测,这是cmd /k的工作方式):

$command = 'C:\xampp\upload.exe backup /command ""option confirm off" ⤦ 
⤥"put "c:\big boy\Documents\dev notes\" "exit""';

编辑 现在,正如您所写,它实际上是winscp.com命令,我会假设:

$command = 'C:\xampp\upload.exe backup /command "option confirm off" ⤦ 
⤥"put ""c:\big boy\Documents\dev notes\""" "exit"';

遵守以下规则:

  • 如果每个命令包含空格,则必须将每个命令包装到"引号中。

    option confirm off
    "option confirm off"
    
  • 如果某个命令还包含"引号,那么这些引号必须加倍""

    put "c:\big boy\Documents\dev notes\"
    "put ""c:\big boy\Documents\dev notes\""" 
    

答案 1 :(得分:1)

在它周围加上单引号:

exec("cd 'C:\\Program Files'");