Перемещение списка пустых папок с одного тома на другой с помощью PowerShell - PullRequest
2 голосов
/ 04 августа 2011

Я использую PowerShell 2.0 на компьютере с Windows SBS 2008 с последними пакетами обновлений. У меня есть двухстрочный скрипт, который находит все пустые папки в каталоге:

$a = Get-ChildItem E:\File_Server -recurse | Where-Object {$_.PSIsContainer -eq $True}
$a | Where-Object {$_.GetFiles().Count -eq 0} | [what now?!]

Вторая строка находит все пустые папки, однако я нахожусь в тупике на последнем канале. Вот что я пробовал до сих пор (имейте в виду, что после второй трубы во второй строке выше были испробованы следующие):

$_.move(F:\path) Да, я пробовал это. Да, я новичок в PowerShell. Конечно, я получил ошибку «Выражения допускаются только как первый элемент конвейера».

move-item -destination F:\Path Я получаю самую последнюю ошибку: «Move-Item: исходный и целевой путь должны иметь одинаковые корни. Перемещение не будет работать для разных томов». Шутки в сторону? Что за ограничение асинина? Идем дальше ...

copy-item -destination F:\empty_folders Очевидно, что я могу обойти ограничение перемещения элемента с помощью copy-item, а затем использовать remove-item. Однако такой удачи нет. Сначала я запустил скрипт с copy-item. PowerShell не выдавал никаких ошибок, но также не делал ничего другого. Он просто сидел там большую часть часа. Каталоги не были перемещены.

Резюме: Как мне взять список пустых папок, которые у меня есть, и с помощью PowerShell переместить эти пустые каталоги в другое место (между томами!), Удалив оригиналы после перемещения? Обратите внимание на предостережение о «использовании PowerShell», поскольку я уже думал о добавлении RoboCopy в смесь, но хотел бы сохранить его в PowerShell.

1 Ответ

2 голосов
/ 04 августа 2011

Я тоже был довольно разочарован этим, но, как вы сказали, copy-item, за которым следует remove-item, сработает:

gci e:\file_server | ?{$_.PSIsContainer -eq $true} | ?{$_.GetFiles().count -eq 0} | 
%{copy-item -LiteralPath $_.fullname -Destination f:\path; remove-item $_.fullname}

Обратите внимание, что это не просто ограничение для Move-Item и Powershell, ноприменимо к .Net System.IO.Directory.Move и, честно говоря, в документации сказано:

Move-Item будет перемещать файлы между дисками, которые поддерживаются одним и тем же провайдером, но он будет перемещать каталоги только в пределахтот же диск.

http://technet.microsoft.com/en-us/library/dd315310.aspx

PS: Вы получили ошибку "Expressions are only allowed as the first element of a pipeline.", потому что $_.move(F:\path), который вы пытались, должен быть внутри объекта foreach, как это так - %{$_.move(F:\path)}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...