Как вы перемещаете файлы / папки между томами с помощью Powershell?

#powershell

#powershell

Вопрос:

Я пытаюсь переместить папку с помощью PowerShell

 move-item  c:test c:test2
  

работает, но

 move-item c:test  192.168.1.50c$test2
  

не выполняет и сообщает мне

Переместить элемент: Исходный и конечный пути должны иметь идентичные корни. Перемещение между томами работать не будет.

Ответ №1:

Если test это каталог, он не будет работать, как указано в документации для Move-Item :

Move-Item файлы будут перемещены между дисками, которые поддерживаются одним и тем же поставщиком, но каталоги будут перемещены только на одном диске.

В этом случае вы можете использовать Copy-Item , за которым следует Remove-Item :

 try {
  Copy-Item -Recurse C:test \192.168.1.50c$test2 -ErrorAction Stop
  Remove-Item -Recurse c:test
} catch {}
  

Другим вариантом, если вы не полагаетесь на PSDrives, было бы просто использовать xcopy или robocopy.

Комментарии:

1. И они, вероятно, захотят использовать -recurse для них.

2. Спасибо, Джоэл. Не подумал об этом cpi не беспокоит копирование содержимого каталогов. Я редко занимаюсь файловой системой с PS.

3. если вы используете CI RI, вы должны убедиться, что элементы не будут удалены в случае сбоя CI (например, недоступный пункт назначения). Используйте ‘-ErrorAction Stop’ с комбинацией директив Try / catch

4. Ильякс: Он имеет в виду комбинацию Copy-Item и Remove-Item .

5. Я могу справиться с этим процессом с помощью 10 строк C #, но я хочу сделать это для powershell, поскольку это может быть сложно, папки и файлы в папке не могут быть скопированы

Ответ №2:

Это необходимо ужесточить и, вероятно, следует превратить в функцию, но это работает.

 $source = "<UNC Path>"
$destination = "<UNC Path>"

if (test-path $destination -PathType Container) 
{
  foreach ( $srcObj in (get-childitem $source )) 
  { 
    $srcObjPath = "$($srcObj.fullname)"
    $destObjPath = "$($destination)$($srcObj.name)" 
    If((Test-Path -LiteralPath $destination)) 
     {
       copy-item $srcObjPath $destination -recurse
       if ( (Test-Path -Path $destObjPath ) -eq $true)
       {
        if ( (compare-object (gci $srcObjPath -recurse) (gci $destObjPath -recurse)) -eq $null)
        {
         write-output "Compare is good. Remove $($srcObjPath)"
         remove-item $srcObjPath -recurse
        }
        else
        {
          write-output "Compare is bad. Remove $($destObjPath)"
          remove-item $destObjPath -recurse
         }
       }
       else 
       { 
        write-output "$($destination) path is bad" 
       }
     }
  else
  {
    write-output "bad destinaton: $($destination)"
  }
 }
}
  

Ответ №3:

У меня была похожая проблема. Я обнаружил, что в папке назначения права пользователя были ограничены. Я изменил полные разрешения на исходном и конечном диске, и перемещение прошло гладко. Сообщение об ошибке «Нет идентичных корней» в команде «переместить элемент».