2011-06-24 11 views
13

lệnh của tôi có kịch bản PowerShell sau đây để xác minh kho SVN của tôi:Làm thế nào để Gọi CMD.EXE từ PowerShell với một không gian trong rõ mục Tên

$SVNAdminDir = 'C:\Program Files (x86)\VisualSVN Server\bin'; 
$RepositoryDir = 'C:\My Repositories\App1'; 
$_cmd = "`"$SVNAdminDir`\svnadmin`" verify `"$RepositoryDir`""; 
Write-Host $_cmd; # Copying this into the command prompt runs without an issue... 
cmd.exe /c $_cmd; # It's when I try to execute the command from PS that I get the error. 

Nhưng khi tôi cố gắng để thực hiện nó, tôi nhận được thông báo lỗi sau:

cmd.exe : 'C:\Program' is not recognized as an internal or external command, 
At line:5 char:12 
+  cmd.exe <<<< /c $_cmd; 
    + CategoryInfo   : NotSpecified: ('C:\Program' is...ternal command,:String) [],  RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

operable program or batch file. 

Kể từ khi tôi về cơ bản thiết $cmd = '"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" verify "C:\My Repositories\App1"'; với dấu ngoặc kép bên trong dấu nháy đơn, tôi đã mong không gian trong C: \ Program Files (x86) \ ... được thông qua đúng ly.

tôi nghi ngờ có điều gì đó tầm thường với chuỗi mà tôi là thiếu ...

Trả lời

15

Bạn cần phải gọi cmd.exe như thế này:

cmd.exe /c "`"$_cmd`"" 

Các lệnh bạn gửi đến cmd.exe cần phải được hoàn toàn bao bọc trong dấu ngoặc kép của riêng họ, không chỉ các đường dẫn có dấu cách là một phần của các lệnh đó. Điều này có liên quan đến cách Powershell phân tích cú pháp chuỗi và nó cần phải chuyển các dấu nháy kép sang số cmd.exe sao cho nó phân tích cú pháp nội dung của các dấu nháy kép một cách chính xác.

Ví dụ, nếu bạn đã ở trong một phiên cmd.exe và thiết lập một biến như thế này:

C:\>set _cmd="C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" verify "C:\My Repositories\App1" 

Sau đó chỉ cần mở rộng biến mà tại dòng lệnh sẽ làm việc:

C:\>%_cmd% 

Tuy nhiên, nếu chuyển nó đến phiên cmd.exe mới, nó cũng sẽ cần thêm dấu ngoặc kép:

C:\>cmd.exe /c "%_cmd%" 
+0

cmd.exe/c "\' "$ _ cmd \" "" Điều đó đã làm được điều đó! Cảm ơn! :-) –

+0

Tôi không thể làm việc này trong PowerShell. 'cmd.exe' liên tục bị lỗi khi phàn nàn rằng' 'C: \ Program' không được nhận dạng như một lệnh nội bộ hay bên ngoài ... '. Tôi đang chạy PowerShell 5.1. Bất kỳ ý tưởng? – STLDeveloper