2015-04-10 3 views
6

Ich versuche, ein Skript zu schreiben, die Robocopy verwendet Wenn ich manuell tun dies nur wurden, mein Befehl wäre:?.

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

ABER, wenn ich das von Powershell tun, wie:

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

robocopy $source $destination $fileLIst $robocopyOptions 

ich:

------------------------------------------------------------------------------- 
    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 " 

Wenn ich jedoch den Robocopy-Befehl an

robocopy $source $destination $fileLIst /NJH /NJS 

alles erfolgreich verläuft ändern.

Also, meine Frage ist, wie kann ich pass einen String als meine Robocopy-Befehlsoptionen (und im weiteren Sinne, das Gleiche tun für einen bestimmten externen Befehl)

Antwort

9

Start robocopy -args "$source $destination $fileLIst $robocopyOptions"
oder
robocopy $source $destination $fileLIst $robocopyOptions.split(' ')

+0

danke, Anton. – weloytty

+0

'Start-Prozess' ist in Ordnung, wenn Sie das separate Konsolenfenster nicht stören. –

+1

Verwenden Sie '-NoNewWindow -PassThru -Wait' Argumente, um ein separates Konsolenfenster zu vermeiden –

4

Sie können keine Zeichenfolge übergeben Optionen auf diese Weise verwenden, denn wenn man

robocopy $source $destination $fileList $robocopyOptions 

Powershell schreiben, wird die letzte Variable bewerten ($robocopyOptions) als eine einzelne Zeichenfolge und es wird es zitiert. Dies bedeutet, dass robocopy "/NJH /NHS" (single string, quoted) in der Befehlszeile erhält. (. Offensichtlich nicht die Absicht)

Einzelheiten darüber, wie um diese Art von Problemen zu arbeiten, finden Sie hier:

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

Der Artikel enthält die folgende Funktion:

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 
    } 
} 

Diese Mit der Funktion können Sie eine ausführbare Datei im aktuellen Konsolenfenster ausführen und ein Array von String-Parametern erstellen, die an sie übergeben werden.

in Ihrem Fall So könnte man diese Funktion so etwas wie folgt verwenden:

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

die Arrays verwenden, Luke. Wenn Sie ein Array mit Werten angeben, wird PowerShell diese automatisch in separate Parameter aufteilen. Nach meiner Erfahrung ist dies die zuverlässigste Methode. Und es erfordert nicht, dass Sie sich mit dem Cmdlet Start-Process anlegen, was meiner Meinung nach für solche Aufgaben übertrieben ist.

Dieser Trick stammt aus dem besten Artikel, den ich über das PowerShell-Verhalten gegenüber externen ausführbaren Dateien gesehen habe: PowerShell and external commands done right.

Beispiel:

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

$CmdLine = @($source, $destination, $fileList) + $robocopyOptions 
& 'robocopy.exe' $CmdLine 
Verwandte Themen