Мой фаворит - использовать класс .Net [IO.DirectoryInfo], который заботится о некоторой логике. Я на самом деле использую это для многих подобных задач сценариев. У него есть метод .Create (), который создает несуществующие каталоги, без ошибок, если они есть.
Поскольку это все еще двухэтапная проблема, я использую псевдоним foreach, чтобы упростить его. Для отдельных файлов:
[IO.DirectoryInfo]$to |% {$_.create(); cp $from $_}
Что касается совпадения нескольких файлов / каталогов, я бы использовал RoboCopy поверх xcopy. Удалите «*» из вашего и просто используйте:
RoboCopy.exe $from $to *
Вы все еще можете добавить / r (Рекурс), / e (Рекурс, включая Пустой), и есть 50 других полезных переключателей.
Редактировать: Оглядываясь назад, это кратко, но не очень читабельно, если вы не часто используете код. Обычно я делю его на две части, например:
([IO.DirectoryInfo]$to).Create()
cp $from $to
Кроме того, DirectoryInfo является типом свойства Parent для FileInfo , поэтому, если ваш $ - - файл, вы можете использовать их вместе:
([IO.FileInfo]$to).Parent.Create()
cp $from $to