Powershell, массовое перемещение файлов определенного типа - PullRequest
4 голосов
/ 22 августа 2011

Я хочу создать скрипт, который будет принимать родительский каталог с несколькими дочерними каталогами, в которых есть файлы.Используя листинг, я хочу переместить все файлы в дочерних каталогах в родительский каталог.

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

    Write-host "Please enter source Dir:"
$sourceDir = read-host

Write-Host "Format to look for with .  :"
$format = read-host

#Write-host "Please enter output Dir:"
#$outDir = read-host

$Dir = get-childitem -Path $sourceDir -Filter $format -recurse | format-table name

$files = $Dir | where {$_.extension -eq "$format"} 
$files #| format-table name

Ответы [ 3 ]

8 голосов
/ 23 августа 2011

Несколько вещей:

  1. Вы можете передавать текст, который вы пишете на экран, непосредственно в командлет read-host, он сохраняет вам строку для каждого пользовательского ввода.

  2. Как правило, если вы планируете сделать больше с помощью вывода команды, НЕ передавайте ее по каналу format- *.Командлеты форматирования создают объекты форматирования, которые инструктируют PowerShell, как отображать результат на экране.

  3. Старайтесь не назначать результат переменной, если результат содержит большой набор файловой системы,потребление памяти может быть очень высоким, и вы можете понизить производительность.

  4. Опять же, с точки зрения производительности, попробуйте использовать параметры командлета вместо командлета where-object (фильтрация на стороне сервера против. сторона клиента).Первый фильтрует объекты на цели, а второй фильтрует объекты только после того, как доберется до вашей машины.

Переключатель WhatIf покажет, какие файлы были бы перемещены.Удалите его, чтобы выполнить команду.Вам также может понадобиться настроить его, чтобы иметь дело с дублирующимися именами файлов.

$sourceDir = read-host "Please enter source Dir"
$format = read-host "Format to look for"

Get-ChildItem -Path $sourceDir -Filter $format -Recurse | Move-Item -Destination $sourceDir -Whatif
1 голос
/ 22 августа 2011

Если я правильно понял ваш вопрос, вы можете использовать Move-Item для файлов, чтобы переместить их в выходной каталог:

$Dir = get-childitem $sourceDir -recurse
$files = $Dir | where {$_.extension -eq "$format"}
$files | move-item -destination $outDir
0 голосов
/ 07 декабря 2017

Предыдущий автор указывал, что скрипт будет перезаписывать файлы с тем же именемМожно было бы расширить сценарий с помощью теста и избежать этой возможности.Как то так:

$sourceDir = read-host "Please enter source Dir"
$format = read-host "Format to look for?"
$destDir = read-host "Please enter Destination Dir"

Get-ChildItem -Path $sourceDir -Filter $format -Recurse | Copy-Item   -Destination $DestDir 
$files = $DestDir | where {$_.extension -eq "$format"} 

If (Test-Path $files) {
    $i = 0
    While (Test-Path $DestinationFile) {
        $i += 1
        $DestinationFile = "$files$i.$format"
        Copy-Item -Destination $DestDir  $DestinationFile
    }
} 
Else {
    $DestinationFile = "$files$i.$format"
    Copy-Item -Destination $DestDir $DestinationFile
}
Copy-Item -Path $SourceFile -Destination $DestinationFile -Force
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...