2014-09-26 2 views
0

Можно ли создавать папки на основе расширения файлов с помощью powershell и перемещать эти файлы в эту папку. Например, у меня есть файлы .jpg и .txt. Я бы хотел, чтобы powershell посмотрел, какие файлы являются .txt, и чем создать документ под названием textfiles и переместить все .txt-файлы в эту папку. Весь мой файл находится в каталоге C: \ testfilesКак создать папку на основе файла extenstion в powershell

$files = 'C:\testfiles\*.txt' 
$foundfiles = Get-ChildItem $files -Filter *.txt -Force -Recurse 
new-item $foundfiles -type directory 

Я знаю, что это не делает Sence. очень нужна помощь

мой сценарий

Get-ChildItem 'C:\testfiles' -Filter *.txt | Where-Object {!$_.PSIsContainer} | Foreach-Object{ 

$dest = Join-Path $_.DirectoryName $_.BaseName.Split()[0] 

if(!(Test-Path -Path $dest -PathType Container)) 
{ 
    $null = md $dest 
} 

$_ | Move-Item -Destination $dest -Force 
} 

это отлично работает, но проблема у меня есть файлы в 10 различных местах. Но в моем сценарии я только даю 1 путь. Как я могу указать более чем на 1 месте

+0

Да, есть способ. что ты уже испробовал? – Raf

+0

$ FILES = 'C:. \ Testfiles \ * .txt' $ foundfiles = Get-ChildItem $ файлы -Filter * .txt -Force -Recurse нового деталь $ foundfiles – srk786

+0

привет раф я только изменил в вопросе – srk786

ответ

0

Вы можете сделать это шаги:
1. Получить все файлы

#Get all files 
[ARRAY]$arr_Files = Get-ChildItem -Path "C:\temp" -Recurse -Force 


2. Посмотрите на возврат propertys

$arr_Files | fl * 


3. Теперь вы видите theres «Расширение: .zip». Таким образом, вы можете посмотреть, существует ли эта папка и когда нет, тогда создайте ее. После этого переместите файл в папку.

#For each file 
Foreach ($obj_File in $arr_Files) { 

    #Test if folder for this file exist 
    If (!(Test-Path -Path "C:\Temp$($obj_File.Extension)")) { 
     New-Item -Path "C:\Temp$($obj_File.Extension)" -ItemType Directory 
    } 

    #Move file 
    Move-Item -Path $obj_File.FullName -Destination "C:\Temp$($obj_File.Extension)\$($obj_File.Name)" 
} 


Теперь вы должны смотреть, что Get-ChildItem -Path "C:\temp" -Recurse -Force возвращает только файлы не папки.

+0

я только изменил мой сценарий – srk786

1

Попробуйте это, он будет динамически создавать каталоги из списка файлов в $roots:

$roots = @("d:\temp\test","C:\testfiles") 

foreach($root in $roots){ 
    $groups = ls $root | where {$_.PSIsContainer -eq $false} | group extension 
    foreach($group in $groups){ 
     $newPath = Join-Path $root ($group.Name.Substring(1,($group.Name.length - 1))) 
     if((Test-Path $newPath) -eq $false){ 
      md $newPath | Out-Null 
     } 
     $group.Group | Move-Item -Destination $newPath 
    } 
} 
+1

Отличное использование 'Join-Path', для чего это было сделано. – Matt

0

Как о чем-то немного более элегантной?

$Files = GCI c:\testfiles\ 
$TXTPATH = <PATH> 
$JPGPATH = <PATH> 
Switch ($Files){ 
    {$_.Extension -eq '.TXT' } { move-item $_.fullname $TXTPATH -force } 
    {$_.Extension -eq '.JPG' } { move-item $_.fullname $JPGPATH -force } 
    } 

Это должно быть сделано?

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