Экранирование пробелов в командной строке WinSCP при выполнении из PHP

У меня должна быть простая проблема. Я пытаюсь выполнить приведенный ниже код на PHP. Цель этого кода - загрузить файлы из одной папки в другую на FTP-сервере с помощью программы WinSCP.

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

Файлы не передаются, и проблема, которую я думаю, возникает из-за пробелов в моем каталоге, где находятся big boy и dev notes. Я попытался включить еще одну двойную кавычку между:

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

но это не сработало.


person user875139    schedule 27.12.2012    source источник
comment
Вы бы сделали то же самое, что и в оболочке операционной системы. Пожалуйста, предоставьте команду, работающую в cmd, иначе это не относится конкретно к PHP и exec, а к оболочке Windows.   -  person hakre    schedule 27.12.2012


Ответы (2)


Давайте сначала немного опустим это на землю. Следующая строка:

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"

Поскольку теперь вам должно быть очевидно, что это недопустимая команда в оболочке. Обратитесь к документации 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\""" 
    
person hakre    schedule 27.12.2012
comment
Спасибо за подробный ответ. Я просто попытался сделать переменную, как вы, для команды $, на моем пути. Однако это все еще не работает. backup.exe - это один из сохраненных сеансов, которые я сделал в программе winscp. Некоторые примеры находятся здесь winscp.net/eng/docs/commandline. - person user875139; 27.12.2012
comment
Какая программа upload.exe? Просто winscp.exe переименовали? Изменить: Я бы сказал сейчас winscp.com, верно? - person hakre; 27.12.2012
comment
да winscp.com или просто winscp.exe переименовали. Извините за путаницу - person user875139; 27.12.2012
comment
Это будет глупый вопрос, но что за стрелки рядом с надписью «Подтвердить» и «убрать»? Это просто пробелы? - person user875139; 27.12.2012
comment
Они должны просто сигнализировать о переносе строк, чтобы их было легче читать. Удалите их, включая разрыв строки между ними, чтобы получить исходную строку. Замена их пробелами не должна повредить, но не предназначалась. - person hakre; 27.12.2012

Заключите его в одинарные кавычки следующим образом:

exec("cd 'C:\\Program Files'");
person Get Off My Lawn    schedule 27.12.2012
comment
У меня была аналогичная проблема с пробелами и одиночными кавычками, исправила это, спасибо !! - person mgrenier; 23.10.2014