Move-Shell 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 +... Each-Object {Move-Item -Literalpath $.Source -Destination $.Destina...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~
+ 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"

Спасибо всем за вашу помощь.

2 ответа

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

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

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

Что если: Выполнение операции "Переместить файл" на целевой объект "Элемент: C:\Temp\SomeFile.xml Пункт назначения: C:\Temp\Somewhere\SomeFile.xml".

Точно сказать не могу. Но ваше сообщение об ошибке указывает, что это ошибка записи 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 в качестве администратора.

Удачи!;-)

Другие вопросы по тегам