2016-11-10 2 views
1

Эй, мне нужно переместить много файлов, используя скрипт powershell, и мне нужна помощь на этом.Powershell найти и переместить предметы

Корня следующего

> tree . 
\ 
├───Folder1 
│ ├───Sub1 
│ │ └───Stockfile 
│ └───Sub2 
└───Folder2 
    ├───Sub1 
    │ └───Stockfile 
    └───Sub2 

Сценарий должен найти stockfiles и нужно переместить их в папку SUB2 каждой Главной папки.

Я сделал следующий сценарий, чтобы показать все stockfiles в списке:

$var = get-childitem -Filter *stock* -recurse 
foreach ($file in $var) { 
write-host ($file.FullName) 
} 
+2

Является ли последовательность 'Sub2' последовательной? Как вы знаете имя папки назначения? Является ли это явно именем Sub2? – gravity

+0

Папки не называются Sub1 и Sub2. Есть около 400 папок, начиная с TM, а затем 6 случайных чисел –

ответ

1

Попробуйте следующее:

Get-ChildItem -File -Recurse -Filter *_stock.csv | 
    Move-Item -WhatIf -Destination { $_.FullName -replace '^(.*)\\Sub1\\','$1\Sub2\' } 

подход извлекает префикс пути до ...\Sub1 из полного пути каждого запаса файл и делает ...\Sub2 путь назначения (каталога).

Таким образом, файлы запаса перемещаются из любого места в поддереве ...\Sub1 непосредственно в ...\Sub2.

Примечание:

  • -WhatIf показывает, что бы произойдет первым; удалите его, чтобы выполнить фактическое перемещение.

  • Предположение о том, что запас пути файлов содержат только один Sub1 компонент, и что нет в наличии файлов с одинаковыми именами в Sub1 поддерева.

  • -replace интерпретирует свой первый операнд в качестве регулярного выражения , из-за чего \ символы. должен быть экранирован как \\, чтобы быть признанным литералом; символам в имени фактической папки также может потребоваться экранирование (но не в этом случае).

    • Если вы не знаете имя папки заранее, вы можете спокойно избежать его [regex]::Escape($folderName)
+0

Ок, я удалил -WhatIf, потому что он работает. Но без инструкции -WhatIf я получаю следующее сообщение: –

+0

Move-Item: Не удалось найти часть пути. [Move-Item], DirectoryNotFoundException + FullyQualifiedErrorId: MoveFileInfoItemIOError, Microsoft.PowerShell.Commands.MoveItemCommand –

+0

Теперь это работает, следующий вызов - переместить файлы из папок, начиная с TM *. Таким образом, имена папок похожи на TM123456, TM456789 и т. Д. В этих папках находятся 2 подпапки. Как перемещать файлы из папок, начиная с TM? –

1

Предположим папки все называют sub1 и sub2.

$var = get-childitem -Filter *stock* -recurse 
foreach ($file in $var) { 
    $parent = Split-Path $file.fullname -parent 
    Move-Item $file.FullName -destination $parent\..\sub2\1.txt 
} 

Я знаю, что это не очень, но это работает;)

0

Я сделал это работать так, спасибо большое.

$var = get-childitem -Filter *_stock.csv -recurse 
foreach ($file in $var) 
{ Move-Item $file.FullName ($file.FullName -replace '^(.*)\\Sub1\\','$1\Sub2\') } 
+1

Это, по сути, решение, которое я предложил, и учитывая, что мой ответ более краткий, а также дает объяснение, примите мой ответ и удалите этот. Позвольте мне дать вам стандартный совет для новичков. Если ответ решает вашу проблему, примите его, нажав на большую галочку (✓) рядом с ней и, возможно, также проголосуйте за нее (для голосования на голосование требуется не менее 15 точек репутации). Если вы нашли другие ответы полезными, попробуйте их проголосовать. Приём и голосование помогают будущим читателям. См. [Соответствующую статью справочного центра] (http://stackoverflow.com/help/someone-answers). – mklement0

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

  • Нет связанных вопросов^_^