带有Robocopy的Powershell(或#$(*&我如何传递参数对吗?)

wel*_*tty 9 powershell robocopy command-line-arguments

我正在尝试编写一个使用robocopy的脚本.如果我只是手动执行此操作,我的命令将是:

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

但是,当我从powershell执行此操作时,例如:

robocopy c:\hold\test1 c:\hold\test2 test.txt /NJH /NJS
Run Code Online (Sandbox Code Playgroud)

我明白了:

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

robocopy $source $destination $fileLIst $robocopyOptions
Run Code Online (Sandbox Code Playgroud)

但是,如果我将robocopy命令更改为

-------------------------------------------------------------------------------
   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 "
Run Code Online (Sandbox Code Playgroud)

一切顺利.

所以,我的问题是,我如何传递一个字符串作为我的robocopy命令选项(并且,在更大的意义上,对任何给定的外部命令执行相同的操作)

Ant*_*n Z 16

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

  • 使用“-NoNewWindow -PassThru -Wait”参数来避免单独的控制台窗口 (2认同)

bea*_*ker 7

使用阵列,卢克.如果指定值数组,PowerShell将自动将它们扩展为单独的参数.根据我的经验,这是最可靠的方法.并且它不需要你弄乱Start-Processcmdlet,在我看来这对于这样的任务来说太过分了.

这个技巧来自我在PowerShell对外部可执行文件的行为上看到的最好的文章:PowerShell和外部命令正确完成.

例:

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

$CmdLine = @($source, $destination, $fileList) + $robocopyOptions
& 'robocopy.exe' $CmdLine
Run Code Online (Sandbox Code Playgroud)

  • 答案中的原始链接已死...这是更新的链接:[PowerShell 和外部命令正确完成](https://slai.github.io/posts/powershell-and-external-commands-done-right/) (2认同)

Bil*_*art 5

您不能使用字符串以这种方式传递选项,因为在编写时

robocopy $source $destination $fileList $robocopyOptions
Run Code Online (Sandbox Code Playgroud)

PowerShell将最后一个变量($robocopyOptions)评估为单个字符串,并将其引用。这意味着robocopy将"/NJH /NHS"在其命令行上获取(单引号引起来)。(显然不是目的。)

有关如何解决这些问题的详细信息,请参见此处:

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

本文包括以下功能:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

此功能将使您可以在当前控制台窗口中运行可执行文件,还可以构建字符串参数数组以传递给它。

因此,在您的情况下,您可以使用以下功能:

Start-Executable robocopy.exe $source,$destination,$fileList,$robocopyOptions
Run Code Online (Sandbox Code Playgroud)