2015-04-10 16 views
6

Tôi đang cố gắng viết một kịch bản sử dụng robocopy.Nếu tôi chỉ làm điều này bằng tay, lệnh của tôi sẽ là:

robocopy c: \ giữ \ test1 c: \ giữ \ test.txt test2/NJH/NJS

NHƯNG, khi tôi làm điều này từ PowerShell, như:

$source = "C:\hold\first test" 
$destination = "C:\hold\second test" 
$robocopyOptions = " /NJH /NJS " 
$fileList = "test.txt" 

robocopy $source $destination $fileLIst $robocopyOptions 

tôi nhận được:

------------------------------------------------------------------------------- 
    ROBOCOPY  ::  Robust File Copy for Windows 
------------------------------------------------------------------------------- 

    Started : Fri Apr 10 09:20:03 2015 

    Source - C:\hold\first test\ 
    Dest - C:\hold\second test\ 

    Files : test.txt 

    Options : /COPY:DAT /R:1000000 /W:30 

------------------------------------------------------------------------------ 

ERROR : Invalid Parameter #4 : " /NJH /NJS " 

Tuy nhiên, nếu tôi thay đổi lệnh robocopy thành

robocopy $source $destination $fileLIst /NJH /NJS 

mọi thứ đều chạy thành công.

Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể vượt qua một chuỗi như các tùy chọn lệnh robocopy của tôi (và, trong một ý nghĩa lớn hơn, làm tương tự cho bất kỳ lệnh bên ngoài cho)

Trả lời

9

Start robocopy -args "$source $destination $fileLIst $robocopyOptions"
hoặc
robocopy $source $destination $fileLIst $robocopyOptions.split(' ')

+0

cảm ơn bạn, Anton. – weloytty

+0

'Bắt đầu-Process' là OK nếu bạn không nhớ cửa sổ giao diện điều khiển riêng biệt. –

+1

sử dụng các đối số '-NoNewWindow -PassThru -Wait' để tránh cửa sổ bảng điều khiển riêng biệt –

4

bạn không thể sử dụng một chuỗi để vượt qua tùy chọn theo cách đó bởi vì khi bạn viết

robocopy $source $destination $fileList $robocopyOptions 

PowerShell sẽ đánh giá các biến cuối cùng ($robocopyOptions) dưới dạng một chuỗi và nó sẽ trích dẫn nó. Điều này có nghĩa là robocopy sẽ nhận được "/NJH /NHS" (chuỗi đơn, được trích dẫn) trên dòng lệnh của nó. (. Rõ ràng không phải là mục đích)

Để biết chi tiết về làm thế nào để làm việc xung quanh các loại vấn đề, xem tại đây:

http://windowsitpro.com/powershell/running-executables-powershell

bài viết này bao gồm các chức năng sau:

function Start-Executable { 
    param(
    [String] $FilePath, 
    [String[]] $ArgumentList 
) 
    $OFS = " " 
    $process = New-Object System.Diagnostics.Process 
    $process.StartInfo.FileName = $FilePath 
    $process.StartInfo.Arguments = $ArgumentList 
    $process.StartInfo.UseShellExecute = $false 
    $process.StartInfo.RedirectStandardOutput = $true 
    if ($process.Start()) { 
    $output = $process.StandardOutput.ReadToEnd() ` 
     -replace "\r\n$","" 
    if ($output) { 
     if ($output.Contains("`r`n")) { 
     $output -split "`r`n" 
     } 
     elseif ($output.Contains("`n")) { 
     $output -split "`n" 
     } 
     else { 
     $output 
     } 
    } 
    $process.WaitForExit() 
    & "$Env:SystemRoot\system32\cmd.exe" ` 
     /c exit $process.ExitCode 
    } 
} 

này chức năng sẽ cho phép bạn chạy một tập tin thực thi trong cửa sổ giao diện điều khiển hiện tại và cũng cho phép bạn xây dựng một mảng các tham số chuỗi để truyền cho nó.

Vì vậy, trong trường hợp của bạn, bạn có thể sử dụng chức năng này một cái gì đó như thế này:

Start-Executable robocopy.exe $source,$destination,$fileList,$robocopyOptions 
4

Sử dụng các mảng, Luke. Nếu bạn chỉ định một mảng các giá trị, PowerShell sẽ tự động mở rộng chúng thành các tham số riêng biệt. Theo kinh nghiệm của tôi, đây là phương pháp đáng tin cậy nhất. Và nó không yêu cầu bạn phải gây rối với lệnh ghép ngắn Start-Process, theo ý kiến ​​của tôi là quá mức cần thiết cho các nhiệm vụ như vậy.

Bí quyết này là từ bài viết hay nhất tôi đã thấy trên hành vi PowerShell về phía các tệp thi hành bên ngoài: PowerShell and external commands done right.

Ví dụ:

$source = 'C:\hold\first test' 
$destination = 'C:\hold\second test' 
$robocopyOptions = @('/NJH', '/NJS') 
$fileList = 'test.txt' 

$CmdLine = @($source, $destination, $fileList) + $robocopyOptions 
& 'robocopy.exe' $CmdLine 
Các vấn đề liên quan