Как мне получить доступ к путям с пробелами в них в Perl в Windows? - PullRequest
2 голосов
/ 04 января 2011

Я конвертирую скрипт Unix Perl для запуска в Windows.У меня проблема с путями, в которых есть пробелы:

open (IN, "| C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe -u root -ppwd") or die "$!";

Приведенный выше код вызывает следующую ошибку:

'C:\Program' is not recognized as an internal or external command,

Я попытался обернутьсбежал \" вот так:

open (IN, "| \"C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe -u root -ppwd\"") or die "$!";

Но радости нет.Как мне обрабатывать пути с пробелами?

Я использую ActiveState v5.10.0, созданный для многопоточности MSWin32-x86.

Ответы [ 4 ]

5 голосов
/ 04 января 2011

Вы цитируете всю команду, включая аргументы командной строки.Вы должны были поставить свою вторую экранированную цитату после mysql.exe:

open (IN, "| \"C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe\" -u root -ppwd") or die "$!";

Возможно, вас также заинтересуют операторы qq() и q(), которые позволяют использовать разделители, отличные от кавычек.разделять строки.Они очень полезны, когда вы хотите заключить в кавычки строку, содержащую кавычки:

qq[| "C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe" -u root -ppwd]

Кроме того, Perl с радостью обработает правильный разделитель пути для имен команд (но не всегда для аргументов команд, поэтому будьте осторожны):

qq[| "C:/Program Files/MySQL/MySQL Server 5.1/bin/mysql.exe" -u root -ppwd]

(И поскольку этот пример не требует интерполяции, вы могли бы использовать одинарные кавычки или конструкцию q():

'| "C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe" -u root -ppwd'

)

2 голосов
/ 04 января 2011

Это Perl, так что есть 1000 способов (как вы увидите), в один конец (избегайте пробелов)

open (IN, "| C:\\Program\ Files\\MySQL\\MySQL\ Server\ 5.1\\bin\\mysql.exe -u root -ppwd") or die "$!";
2 голосов
/ 04 января 2011

Вы также должны выйти из пробелов.

open (IN, "| C:\\Program\ Files\\MySQL\\MySQL\ Server\ 5.1\\bin\\mysql.exe -u root -ppwd") or die "$!";

Или использовать старые 8.3 имена :

open (IN, "| C:\\Progra~1\\MySQL\\MySQL~1\\bin\\mysql.exe -u root -ppwd") or die "$!";

Хотя я должен задать вопросРазумность использования MySQL-клиента вместо использования DBI

1 голос
/ 04 января 2011

Мое решение состояло в том, чтобы сделать это:

$mysql = "C:\\Program\ Files\\MySQL\\MySQL\ Server\ 5.1\\bin\\mysql.exe";
open (IN, "| \"$mysql\" -u root -ppwd") or die "$!";

Обновление: Я также заметил, что, как справедливо указывает @mob, мой \" был в неправильном месте.Двадцать пять лет DOS, и я скучаю по этому: /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...