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 в качестве администратора.
Удачи!;-)