Powershell Move-Item из Import-CSV: ошибка - не удалось найти часть пути

Я работал над сценарием в Powershell, чтобы получить пути из файла CSV и переместить эти файлы по соответствующему пути в новое место назначения в другом месте. часто с другим именем файла.

Я использую версию 5.0

Например:

Source Destination : C:\1\2\3\File.pdf, D:\3\7\8\9\FILE1.pdf

Теперь я использовал следующий скрипт, и изначально он смог переместить некоторые файлы:

Import-CSV "R:\MoveFiles.csv" -Delimiter "," -ErrorAction Stop | ForEach-Object{Move-Item  -path $_.Source -Destination $_.Destination}

Хотя примерно на полпути выполнения он начал возвращать эту ошибку:

Move-Item: не удалось найти часть пути. В строке: 1 символ: 238 + ... Каждый-объект {Move-Item -Literalpath $ .Source -Destination $ .Destina ...
+ ~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ < br> + CategoryInfo: WriteError: (Q: \ RECORDS \ PRIV ...- 4-20_N1969.pdf: FileInfo) [Move-Item], DirectoryNotFoundException
+ FullyQualifiedErrorId: MoveFileInfoItemIOError, Microsoft.PowerShell.Commands.MoveItemCommand

Насколько я могу судить, нет никаких специальных символов, которые помешали бы найти путь. Если я заменю Move-Item на Copy-Item, он вернет ту же ошибку. Я также проверил пути, чтобы узнать, верны они или нет.

Я в своем уме, чтобы кончить этим. Не уверен, что еще попробовать. В конце концов, я же полный новичок.

Спасибо

NB: Я нашел решение этой проблемы. Похоже, что командлет Move-Item не любит создавать каталоги.

Вместо этого я сначала создал каталоги с помощью New-Item -directories, получив содержимое из текстового документа, где каждая строка представляет путь (без заголовков).

После создания пустых каталогов исходный сценарий работал так, как задумано.

Для всех, кто интересуется, вот сценарий каталогов:

 #CREATE DIRECTORIES FROM CSV

cd 

$name = Get-Content ".\Create_New_Directories\Move_Directories_Test.txt"
Foreach ($_ in $name)
{
    New-Item -Force -verbose -path $_ -Type Directory
} 

Out-File ".\Create_New_Directories\Newoutput.txt"

Всем спасибо за помощь.


person DrDro    schedule 15.03.2018    source источник
comment
Опубликуйте, пожалуйста, строку из CSV-файла с ошибкой.   -  person Tomalak    schedule 15.03.2018
comment
@Tomalak Каждая строка CSV терпит неудачу, их 13 050. Я выполняю работу с рабочего компьютера в общей сети, есть ли вероятность, что он не перемещается по этой причине?   -  person DrDro    schedule 15.03.2018
comment
О, я думал, ты сказал, что на полпути все началось   -  person Tomalak    schedule 15.03.2018


Ответы (2)


Чтобы отладить такие случаи, рассмотрите параметр Move-Item -WhatIf. Вот так,

... | ForEach-Object{Move-Item -whatif  -path $_.Source -Destination $_.Destination}

Это напечатает предполагаемую операцию, так что вы можете дважды проверить пути на наличие шениганов.

Что, если: Выполнение операции «Переместить файл» на целевом «элементе: C: \ Temp \ SomeFile.xml Назначение: C: \ Temp \ Somewhere \ SomeFile.xml».

person vonPryz    schedule 15.03.2018
comment
Я просто попробовал. Ни один из этих путей не выглядит явно ошибочным. На самом деле он выглядит точно так же, как и ваш. - person DrDro; 15.03.2018

Не уверен. Но ваше сообщение об ошибке указывает, что это ошибка записи DirectoryNotFound. Так что, возможно, вам следует убедиться, что у вас есть химические завивки на целевой стороне и не превышают лимиты символов по длине пути.

Еще кое-что, что следует учесть / попробовать:

Ваш CSV-файл должен быть в формате (первая строка должна быть заголовками):

Source,Destination
C:\1\2\3\SomeFile.pdf,D:\1\2\3\SomeFile.pdf
C:\1\2\3\SomeFile2.pdf,D:\1\2\3\SomeFile2.pdf

Кроме того, вы не очищаете свой ввод, поэтому, если вы создали файл CSV в Excel, у вас могут быть начальные или конечные пробелы. В этом случае либо очистите редактирование файла в Блокноте, либо попробуйте $_.Source.trim() и $_.Destination.trim()

И как другой парень сказал, что ключ -whatif полезен, как и -verbose.

Вы также можете попробовать Move-Item -Force и / или открыть PowerShell от имени администратора.

Удачи! ;-)

person mOjO    schedule 15.03.2018