使用Robocopy和Powershell 5

时间:2016-07-27 15:13:50

标签: powershell robocopy

我将我的开发机器升级到Powershell 5,现在在PS2中运行的代码不在PS5中。

我的代码使用Robocopy将文件从svn checkout目录复制到工作目录。它还用于清理工作目录。

原始代码如下所示:

    $what = @("""/copy:DAT""","""/E""","/XD .svn","/XD Debug","/XF .pdb")
    $options = @("""/R:4""","""/W:5""","""/TS""","""/NS""","""/Tee""","""/NP""")
    if ($file) {
        $cmdArgs = @("""$src""", """$dest""", """$file""", $what, $options)
    }else
    {
        $cmdArgs = @("""$src""", """$dest""", $what, $options)
    }
    robocopy $cmdArgs

当使用powershell 5运行命令时,我得到了

  

错误:参数#3无效:" / copy:DAT / E / XD .svn / XD Debug / XF   的.pdb"

我看到发生了什么,它将参数视为一个单独的命令,而不是单独的参数。 我试过单引号,我试过单引号,但我仍然得到相同的结果。

如果我将选项硬编码到执行行,

  

robocopy $ cmdArgs / COPY:DAT / E / XD .svn / XD Debug / XF .pdb / R:4 / W:5   / TS / NS / Tee / NP

然后该命令将起作用,所以我现在有一个解决方法,但仍然宁愿拥有原始的参数化结构。

我需要做些什么才能让它适用于PS5?谢谢。

编辑:使用Windows 10和PS5,我收到以下错误: 错误:参数#5无效:" / XD .svn"

$what = @("""/PURGE""","""/E""","/XD .svn","/XD Debug","/XF .pdb")
$options = @("""/R:4""","""/W:5""","""/TS""","""/NS""","""/Tee""","""/NP""")
$cmdArgs = @("""$srcBase""","""$targetPath"""; $what) 

对于' / XD .svn'我试过用三引号,单引号,转义引号等封装它。但是,没有成功。

3 个答案:

答案 0 :(得分:0)

您正在构建锯齿状阵列。您可以在运行包含的代码后查看$ cmdargs的结果来验证这一点

""
""
"/copy:DAT"
"/E"
/XD .svn
/XD Debug
/XF .pdb
"/R:4"
"/W:5"
"/TS"
"/NS"
"/Tee"
"/NP"

这看起来是正确的,但如果您只是访问第三个元素$ cmdArgs [2],您可以看到它包含$ what数组的全部内容

"/copy:DAT"
"/E"
/XD .svn
/XD Debug
/XF .pdb

作为一种快速而肮脏的解决方法,请尝试以下方法:

    $what = @("""/copy:DAT""","""/E""","/XD .svn","/XD Debug","/XF .pdb")
    $options = @("""/R:4""","""/W:5""","""/TS""","""/NS""","""/Tee""","""/NP""")
    if ($file) {
        $cmdArgs = @("""$src""", """$dest""", """$file""")
        $cmdArgs += $what
        $cmdArgs += $options
    }else
    {
        $cmdArgs = @("""$src""", """$dest""")
        $cmdArgs += $what
        $cmdArgs += $options
    }
    robocopy $cmdArgs

编辑: 稍微编辑上面,和 More on Jagged vs Multidimensional vs standard arrays here。向下看。基本上,构建数组的方式被解释为@(0,1,(0,1,2,3,4),(0,1,2,3,4,5))

答案 1 :(得分:0)

哇!多么痛苦,但我有一个解决方案。 我不得不使用字符串拆分方法并拆分空格。我不得不抛弃数组并创建一个字符串。

$cmdArgs = @("""$srcBase""", """$targetPath""") #still required for quoted paths
$what = "/PURGE /E /XD .svn /XD DEBUG /XF .pdb"
$options = "/R:4 /W:5 /TS /NS /Tee /NP"
robocopy $cmdArgs $what.split(' ') $options.split(' ')

PS 2.0和更高版本之间的某些东西改变了我的代码,但这似乎解决了它。希望这有助于拯救他人免于痛苦的日子。 :)

编辑:在对此进行反思后,我认为这是PS和Robocopy之间的问题,其中带有值的参数无法正确评估。令我感到羞耻的是,我花了很多尝试来尝试一个简单的字符串作为参数。

答案 2 :(得分:0)

太多令人难以置信的引语!除了源路径和目标路径之外,您根本不需要它们。我找到的最好的方法是创建一个格式化的字符串表达式,然后执行它。

rowEditingPlugin.on('beforeedit', function(editor, e) {
    editor.editor.form.getFields().each(function(field){
        if (field instanceof Ext.form.field.ComboBox) {
            field.store.clearFilter(true);
        }
    });
});