PowerShell и Robocopy - неверное имя файла при попытке передать папку переменных в качестве места назначения

Я пытаюсь использовать сценарий PowerShell, запускающий Robocopy*, для резервного копирования некоторых файлов в новый каталог:

$Timestamp = Get-Date -format ddMMyyyy

$DestFolder = "`"\\NASBOX\Archives\$Timestamp\`""
$SourceFolder = "`"\\DESKTOP\d$`""

ROBOCOPY $SourceFolder $DestFolder /COPYALL /B /R:10 /W:90 /LOG:$Timestamp.txt /FP /TEE

Это дает мне следующую ошибку:

2018/01/23 16:26:20 ERROR 123 (0x0000007B) Accessing Destination Directory \\NASBOX\Archives\23012018" \COPYALL \B \R:10 \W:90 \LOG:23012018.txt \FP \TEE\
The filename, directory name, or volume label syntax is incorrect.

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

Я примерно понимаю, почему это происходит, но, несмотря на ~ два часа, проведенных в сети, я не могу найти решение, которое работает в моем конкретном контексте.

Где я ошибаюсь?

* Я пробовал использовать Copy-Item, но на диске "D" этого рабочего стола есть несколько очень длинных путей к каталогам.


person turbonerd    schedule 23.01.2018    source источник
comment
У вашей ошибки есть цитата в конце папки без соответствующей открытой цитаты.   -  person Matt    schedule 23.01.2018


Ответы (2)


Проблема в том, что на пути, который вы строите, заканчивается косая черта:

"\\NASBOX\Archives\23012018\"

Эта косая черта экранирует двойную кавычку для robocopy, она рассматривает этот путь как содержащий символ кавычки в конце:

\\NASBOX\Archives\23012018"

Сообщение об ошибке показывает это, но не очень помогает! Чтобы решить эту проблему, просто удалите косую черту в конце пути:

$DestFolder = "`"\\NASBOX\Archives\$Timestamp`""
person James C.    schedule 23.01.2018
comment
Экранирование кавычек не обязательно. Просто введите пути в переменные, используйте эти переменные в командной строке robocopy, и PowerShell при необходимости укажет кавычки. - person Bill_Stewart; 23.01.2018

Вам не нужно так сильно стараться с экранированием кавычек в ваших переменных. PowerShell сделает большую часть этого за вас. Это должно быть все, что вам нужно сделать:

$Timestamp = Get-Date -Format ddMMyyyy

$SourceFolder = "\\DESKTOP\d$"
$DestFolder = "\\NASBOX\Archives\$Timestamp"

ROBOCOPY $SourceFolder $DestFolder /COPYALL /B /R:10 /W:90 /LOG:$Timestamp.txt /FP /TEE

Обратите внимание, что папка назначения не должна содержать завершающий \.

TL; DR - нет необходимости создавать строки со встроенными символами " для перехода к robocopy. Просто введите переменные в robocopy командной строке, и PowerShell при необходимости автоматически заключает кавычки.

person Bill_Stewart    schedule 23.01.2018