2016-06-22 3 views
0

Я пытаюсь использовать PowerShell для копирования отдельных файлов из массива в папку назначения. Однако мне нужно также скопировать каждый файл с соответствующей исходной папкой. Не все содержимое этой папки, а только папка и файл. Например:Скопируйте один отдельный файл с его родительской папкой/полным путем

Copy-Item -Path \\SERVER\FOLDER1\FOLDER2\FILE.TXT -Destination E:\TEMP 

Теперь очевидно, что это принесет этот файл, но это все. Мне нужно, чтобы он доставил этот файл и, по крайней мере, папку, в которой он находится, поэтому я предпочел бы завершить это: E: \ TEMP \ FOLDER2 \ FILE.TXT. В качестве альтернативы, хотя и не идеально, я мог бы иметь дело с E: \ TEMP \ FOLDER1 \ FOLDER2 \ FILE.TXT. Но я ничего не делаю, это переносить папку/контейнер, в котором находится файл, только сам файл и все.

ответ

1

Если структура каталогов уже существует, вы можете попробовать это:

Get-Item '\SERVER\FOLDER1\FOLDER2\FILE.TXT' | 
    Copy-Item -Destination { Join-Path 'E:\TEMP' $_.Directory.Name } 

Если нет, вы должны сохранить новый путь к каталогу в переменной и создать его в первую очередь.

+0

Спасибо, Мартин. Папка еще не существует в целевом объекте, поэтому я пытаюсь перенести файл ** и ** его соответствующую папку в целевую папку. Я пытаюсь запустить что-то вроде следующей строки перед строкой, которую вы предоставили, но это не работает для меня (конечно, потому что я делаю что-то неправильно): 'Get-Item $ file | Новый элемент {Join-Path 'E: \ TEMP' (Split-Path $ _. DirectoryName -Leaf)} -тип каталога | Out-Null' ** - OR - ** 'Get-Item $ file | Новый элемент E: \ TEMP \ $ _.Каталог каталогов DirectoryName | Out-Null' - ($ file - это переменная, которая исходит из того, что находится в большем массиве) – EdgarBot

+1

'Split-Path' здесь не требуется. '$ _. Directory.Name' предоставит вам имя каталога. –

+0

@AnsgarWiechers Спасибо за подсказку, я обновил свой ответ. –

1

Возможно, вам лучше использовать robocopy.

robocopy \\SERVER\FOLDER1 E:\TEMP FILE.TXT /s 

Если вы получаете исходный путь в качестве строки (или список строк) входного сигнала, который может обработать его так:

'\\SERVER\FOLDER1\FOLDER2\FILE.TXT', ... | Get-Item | ForEach-Object { 
    robocopy $_.Directory.Parent.FullName E:\TEMP $_.Name /s 
} 
+0

Спасибо Ansgar. Я подумал о том, как использовать Robocopy и попробовать несколько раз, но моя самая большая проблема заключается в том, что Robocopy требует, чтобы вы разделили имя файла и его путь на два отдельных входа для команды. Файлы, которые я пытаюсь скопировать, все индивидуально вытягиваются из массива переменных в PowerShell, поэтому они переходят к команде robocopy как полный путь + имя файла, то есть \\ SERVER \ FOLDER1 \ FOLDER2 \ FILE.TXT. Robocopy требует, чтобы вы разделили его так, чтобы он стал примером, упомянутым выше, а также поднялся на одну папку на входе (до FOLDER1). – EdgarBot

+0

Это предложение похоже, что оно меня приближает: '\\ SERVER \ FOLDER1 \ FOLDER2 \ FILE.TXT ', ... | Get-Item | ForEach-Object {robocopy $ _. Directory.Parent.FullName E: \ TEMP $ _. Name/s} ' Предостережение - это когда я запускаю это в своем коде, похоже, что он как-то пытается искать или прокручивать каждый единственная папка в относительном пути, где находится этот файл - из которых тысячи папок, вместо того, чтобы просто получить конкретный файл и конкретную папку, в которой он находится, игнорируя все остальное. Я уверен, что это, очевидно, еще что-то, что я не понимаю. (продолжение в следующем комментарии) – EdgarBot

+0

Из моего массива я делаю цикл foreach, с разбиением на новую переменную, так как пути все сгруппированы в массиве. Как только переменные разбиваются на отдельные строки, в коде я делаю это: '$ file | Get-Item | ForEach-Object {robocopy $ _. Directory.Parent.FullName E: \ TEMP $ _. Name/s} ' Теперь это работает, но опять же, он просматривает все тысячи папок, где файл, который мне нужно скопировать происходит, и, в конечном итоге, копирует этот один файл, но в итоге это очень медленно. – EdgarBot

Смежные вопросы