2016-07-27 3 views
0

Я обновил свою машину разработки до Powershell 5, и теперь код, который работает в PS2, не находится в PS5.Использование Robocopy с Powershell 5

В моем коде 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 я получаю

ERROR : Invalid Parameter #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? Спасибо.

EDIT: С 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' У меня есть попытался включить его с тройными кавычками, одинарными кавычками, скрытыми кавычками и т. д. Однако успеха не было.

+0

', $ what, $ options' ->'; $ Что; $ options' – PetSerAl

+0

Благодарим вас за предложение, но это не с той же проблемой. Может ли кто-нибудь сделать мне одолжение и попробовать тот же сценарий с PowerShell 5? Я понимаю, что это зазубренный массив, и я подозреваю, что PowerShell запутывается. Однако мне нужен способ выполнить robocopy в powershell. –

ответ

0

Wow! Какая боль, но у меня есть решение. Мне пришлось использовать метод разделения строк и разбивать на пробелы. Мне пришлось отбросить массив и создать одну строку.

$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 и более поздней версии изменилось, что сломало мой код, но это, похоже, исправить. Надеюсь, это поможет спасти других от дней боли. :)

EDIT: после размышлений об этом я полагаю, что это проблема между PS и Robocopy, где параметры со значениями не оцениваются должным образом. То, что мне стыдно, в том, что для меня было так много попыток попробовать простую строку в качестве параметра.

0

Вы строите зубчатый массив. Вы можете убедиться в этом, посмотрев на результатах $ cmdargs после выполнения кода вы включенной

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

Это выглядит правильно, но если вы просто получить доступ к третьему элементу $ cmdArgs [2] вы можете увидеть, что она охватывает всю содержимое перегонного $, что массив

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

EDIT: редактирует выше Путем незначительной, и More on Jagged vs Multidimensional vs standard arrays here. Посмотрите на дно. По существу, способ построения массива интерпретируется как @ (0,1, (0,1,2,3,4), (0,1,2,3,4,5))

+0

Прошу прощения за задержку ответа, это была тирания срочной ситуации. :) Я нахожусь в системе Windows 10 x86, и, конечно, она использует PowerShell 5, и я все еще сталкиваюсь с теми же проблемами. Я не могу правильно построить командную строку, которая правильно анализирует. Когда я возвращаюсь к машине PowerShell 2.0, командная строка отлично разбирается. Я попробовал это предложение выше, но получил те же результаты. –

0

Слишком много ошеломляющих цитат! Вам они действительно не нужны, кроме исходного пути и пути назначения. Лучший способ, который я нашел, - создать форматированное строковое выражение, а затем выполнить его.

$what = "/copy:DAT /E /XD .svn /XD Debug /XF .pdb" 
$options = "/R:4 /W:5 /TS /NS /Tee /NP" 
$source = "C:\DataSource" 
$destination = "D:\DataDestination" 

$expression = [string]::Format('ROBOCOPY "{0}" "{1}" {2} {3}', $source,$Destination,$what,$options) 
$rc = Invoke-Expression $expression 
$rc = $LASTEXITCODE; 
    Switch ($rc) 
{ 
    0 {$msg = 'No files were copied. No failure was encountered. No files were mismatched.'} 
    1 {$msg = 'All files were copied successfully.'} 
    2 {$msg = 'There are some additional files in the destination directory that are not present in the source directory. No files were copied.'} 
    3 {$msg = 'Some files were copied. Additional files were present. No failure was encountered.'} 
    5 {$msg = 'Some files were copied. Some files were mismatched. No failure was encountered.'} 
    6 {$msg = 'Additional files and mismatched files exist. No files were copied and no failures were encountered. This means that the files already exist in the destination directory.'} 
    7 {$msg = 'Files were copied, a file mismatch was present, and additional files were present.'} 
    8 {$msg = 'Several files did not copy.'} 
    default {$msg = 'Robocopy failed with an error'} 
} 
$msg 
If($rc -ge 8) {Throw} 
Смежные вопросы