2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185

Поиск файлов в папках по шаблону исключив пути

21.05.2021, 14:02. Показов 4105. Ответов 28

Студворк — интернет-сервис помощи студентам
Доброго дня уважаемые...

немного запутался в создании скрипта..
цель следующая:

Поиск файлов на диске C:\ по шаблону #('*.doc,*.docx,*.ods,*.odt,*.xls,*.xlsx ,*.xlsb,*.ppt,*.pptx,*.pptm,*.pdf')

кроме указанных папок #$ignore = @("C:\Program Files", "C:\Program Files (x86)", "C:\Windows", "C:\Windows10Upgrade")

записать найденные файлы в текстовый файл C:\temp\popalsya.txt - если папки temp не существует то создать её
и все найденные файлы переместить в папку C:\temp\

вот что есть ...., Буду благодарен за помощь заранее спасибо...

Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cls
sl $PSScriptRoot
[Environment]::CurrentDirectory = gl
$dates= (Get-Date).ToString('dd.MM.yyyy   HH.mm')
$RootPath = 'C:\'
$ignore = @("C:\Program Files", "C:\Program Files (x86)", "C:\Windows", "C:\Windows10Upgrade")
$files = gci $RootPath  -re *.doc,*.docx,*.ods,*.odt,*.xls,*.xlsx,*.xlsb,*.ppt,*.pptx,*.pptm,*.pdf | ? { !$_.PSIsContainer } | % { $relative = $_.FullName.Replace($RootPath,"")
$nomatch = $true
foreach ($folder in $ignore) {
    if($relative -like "*\$folder\*") {
        $nomatch = $false 
      } 
   }  
      if ($nomatch) {
 $_ | Out-File C:\temp\popalsya-$($dates).txt -Append
  }
 }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2021, 14:02
Ответы с готовыми решениями:

Поиск файлов в папках
Здравствуйте. Нужно осуществить поиск файлов определенных расширений и вывести их количество. Мой код работает, но он выводит файлы из...

Поиск файлов в папках.
здравствуйте! помогите осуществить операцию с файлами не при их открытии, а с помощью поиска их (файлов) в папках. есть изначальный код,...

Поиск файлов в папках
Приветствую. Есть код для поиска файлов: procedure FindFiles(StartFolder, Mask: string; List: TStrings; ScanSubFolders: Boolean =...

28
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185
24.05.2021, 15:57  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fors1k Посмотреть сообщение
(string destFileName, bool overwrite);
там написано так -
destFileName String
Путь, указывающий на местоположение, в которое необходимо переместить файл; в этом же пути можно задать и другое имя файла.
а значит что имя файла как я понял не обязательно указывать.? т.е . вот это
PowerShell
1
2
3
$recurseSerchInstance.runSearch().Foreach{
$_.MoveTo("C:\tests", $true)
}
должно поидее отрабатываться без ошибки... .но увы.
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
24.05.2021, 16:45
Цитата Сообщение от magarjoba Посмотреть сообщение
а значит что имя файла как я понял не обязательно указывать.?
Обязательно, просто его можно указать отличным от исходного.


Если хотите "попроще", то используйте командлеты powershell, а не методы дотнета. Их не просто так придумали.

Можно:
PowerShell
1
2
3
4
$file = "C:\qwe.txt"
$dest = "C:\1"
 
Move-Item -path $file -Destination $dest
Неможно:
PowerShell
1
2
3
4
5
$file = "C:\qwe.txt"
$dest = "C:\1"
 
$fi = [IO.FileInfo]::new($file)
$fi.MoveTo($dest )
0
 Аватар для alhaos
1934 / 549 / 155
Регистрация: 20.02.2019
Сообщений: 2,675
Записей в блоге: 77
24.05.2021, 17:24
что то не то у списка с foreach

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
$conf = @{
    extensionList    = [string[]]@(
        '*.doc', '*.docx', '*.ods', '*.odt', '*.xls', '*.xlsx',
        '*.xlsb', '*.ppt', '*.pptx', '*.pptm', '*.pdf', '*.txt', '*.jpg'
    )
 
    targetPath       = [string]'C:\tmp'
 
    excludePathsList = [string[]]@(
        "C:\Program Files", "C:\Program Files (x86)", "C:\Windows", 'c:\install', 'C:\tmp\pdf'
    )
 
    moveToDirectory = [string]'c:\temp'
 
}
 
class recurseSerch {
    [string[]]$extensionList
    [string]$targetPath
    [string[]]$excludePathsList
    [System.Collections.Generic.List[System.IO.FileInfo]]$files
    [string]$moveToDirectory
 
    recurseSerch ([hashtable]$conf_) {
        $this.extensionList = $conf_.extensionList
        $this.targetPath = $conf_.targetPath
        $this.excludePathsList = $conf_.excludePathsList
        $this.files = [System.Collections.Generic.List[System.IO.FileInfo]]::new()
        $this.SearchFilesInDirectoryes($this.targetPath)
        $this.moveToDirectory = $conf_.moveToDirectory
    }
 
    [System.Collections.Generic.List[System.IO.FileInfo]] runSearch(){
        $this.files.Clear()
        $this.SearchFilesInDirectoryes($this.targetPath)    
        return $this.files
    }
 
    SearchFilesInDirectoryes ([string]$targetPath_) {
        $dirs  = (Get-ChildItem $targetPath_ -Directory -ErrorAction SilentlyContinue) 
        $dirs.ForEach{
            if ($_.FullName -notin $this.excludePathsList){
                (Get-ChildItem "$($_.FullName)\*" -File -Include $this.extensionList).foreach{$this.files.add($_.FullName)}
                $this.SearchFilesInDirectoryes($_.FullName) 
            }
        } 
    }
}
 
$recurseSerchInstance = [recurseSerch]::new($conf)
$a = $recurseSerchInstance.runSearch().GetEnumerator()
while ($a.MoveNext()) {
    Move-Item $a.Current.FullName -Destination $recurseSerchInstance.moveToDirectory -WhatIf
}
Добавлено через 12 минут
оригинально
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PS C:\Users\alHaos> $list = [System.Collections.Generic.List[int]]::new()
PS C:\Users\alHaos>
PS C:\Users\alHaos> (0..4).ForEach{
>>     $list.Add($_)
>> }
PS C:\Users\alHaos>
PS C:\Users\alHaos> "foreach:"
foreach:
PS C:\Users\alHaos> $list.ForEach{
>>     param($el)
>>     write-host "`$_ : [$_]"
>>     write-host "`$el`: [$el]"
>>
>> }
$_ : []
$el: [0]
$_ : []
$el: [1]
$_ : []
$el: [2]
$_ : []
$el: [3]
$_ : []
$el: [4]
Добавлено через 2 минуты
в нашем случае

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
$conf = @{
    extensionList    = [string[]]@(
        '*.doc', '*.docx', '*.ods', '*.odt', '*.xls', '*.xlsx',
        '*.xlsb', '*.ppt', '*.pptx', '*.pptm', '*.pdf', '*.txt', '*.jpg'
    )
 
    targetPath       = [string]'C:\tmp'
 
    excludePathsList = [string[]]@(
        "C:\Program Files", "C:\Program Files (x86)", "C:\Windows", 'c:\install', 'C:\tmp\pdf'
    )
 
    moveToDirectory = [string]'c:\temp'
 
}
 
class recurseSerch {
    [string[]]$extensionList
    [string]$targetPath
    [string[]]$excludePathsList
    [System.Collections.Generic.List[System.IO.FileInfo]]$files
    [string]$moveToDirectory
 
    recurseSerch ([hashtable]$conf_) {
        $this.extensionList = $conf_.extensionList
        $this.targetPath = $conf_.targetPath
        $this.excludePathsList = $conf_.excludePathsList
        $this.files = [System.Collections.Generic.List[System.IO.FileInfo]]::new()
        $this.SearchFilesInDirectoryes($this.targetPath)
        $this.moveToDirectory = $conf_.moveToDirectory
    }
 
    [System.Collections.Generic.List[System.IO.FileInfo]] runSearch(){
        $this.files.Clear()
        $this.SearchFilesInDirectoryes($this.targetPath)    
        return $this.files
    }
 
    SearchFilesInDirectoryes ([string]$targetPath_) {
        $dirs  = (Get-ChildItem $targetPath_ -Directory -ErrorAction SilentlyContinue) 
        $dirs.ForEach{
            if ($_.FullName -notin $this.excludePathsList){
                (Get-ChildItem "$($_.FullName)\*" -File -Include $this.extensionList).foreach{$this.files.add($_.FullName)}
                $this.SearchFilesInDirectoryes($_.FullName) 
            }
        } 
    }
}
 
$recurseSerchInstance = [recurseSerch]::new($conf)
$recurseSerchInstance.runSearch().ForEach{
    param($element)
    Move-Item $element.FullName -Destination $recurseSerchInstance.moveToDirectory -WhatIf
}
Добавлено через 1 минуту
надо будет с этими делегатами поразбираться

Добавлено через 48 секунд
только насчет одинаковых имен файлов задумайтесь.

Добавлено через 50 секунд
можно после runSearch проверить.

Добавлено через 6 минут
))

PowerShell
1
2
3
4
5
6
7
8
9
$list = [System.Collections.Generic.List[int]]::new()
 
(0..4).ForEach{
    $list.Add($_)    
}
 
$list.ForEach{param($_)
    write-host "`$_ : [$_]" 
}
Code
1
2
3
4
5
$_ : [0]
$_ : [1]
$_ : [2]
$_ : [3]
$_ : [4]
1
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185
24.05.2021, 18:41  [ТС]
нашел такое описание....
Важным отличием является то, что FileInfo.MoveTo() обновит путь к файлу объекта FileInfo до конечного пути. Очевидно, что это не относится к File.Move() , поскольку он использует только строки в качестве входных данных.

PowerShell
1
2
3
while ($a.MoveNext()) {
    Move-Item $a.Current.FullName -Destination $recurseSerchInstance.moveToDirectory -Force #-WhatIf
    }
добавил что-б перезаписывало.
Цитата Сообщение от alhaos Посмотреть сообщение
moveToDirectory = [string]'c:\temp'
Вопрос по Исходной директории, Если её например не существует...
соответственно создается вместо директории файл без расширения с названием temp
проверка делается
как бы корректно сделать проверку

PowerShell
1
2
3
 if(Test-Path -Path $recurseSerchInstance.moveToDirectory){
    New-Item -ItemType Directory -Force -Path $NewFolder
}
Добавлено через 45 минут
Цитата Сообщение от magarjoba Посмотреть сообщение
Вопрос по Исходной директории, Если её например не существует..
Сделать...

PowerShell
1
2
3
4
5
6
7
8
$recurseSerchInstance = [recurseSerch]::new($conf)
$recurseSerchInstance.runSearch().ForEach{
param($element)
if((Test-Path $recurseSerchInstance.moveToDirectory) -contains $false){    
New-Item -ItemType Directory -Force $recurseSerchInstance.moveToDirectory
 }
    Move-Item $element.FullName -Destination $recurseSerchInstance.moveToDirectory -Force #-WhatIf
    }
0
 Аватар для alhaos
1934 / 549 / 155
Регистрация: 20.02.2019
Сообщений: 2,675
Записей в блоге: 77
24.05.2021, 18:47
ты ее на стадии инициализации класса вставь.

Добавлено через 33 секунды
30 строка
0
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185
24.05.2021, 19:16  [ТС]
Цитата Сообщение от alhaos Посмотреть сообщение
ты ее на стадии инициализации класса вставь.
ока... сделаю

ну че последний рывок.. Например Файл открыт другим приложением...
нам нужно дропнуть тогда этот процесс......вопрос как это сделать...)))

PowerShell
1
2
3
4
5
6
Move-Item : Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
C:\Users\administrator\Desktop\SEAch.ps1:59 знак:5
+     Move-Item $element.FullName -Destination $recurseSerchInstance.mo ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (C:\tests\253.xls:FileInfo) [Move-Item], IOException
    + FullyQualifiedErrorId : MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand
0
 Аватар для alhaos
1934 / 549 / 155
Регистрация: 20.02.2019
Сообщений: 2,675
Записей в блоге: 77
24.05.2021, 19:20
Поройся в разделе было где-то

я бы через блок try {} catch {} делал.
0
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185
25.05.2021, 09:28  [ТС]
Цитата Сообщение от alhaos Посмотреть сообщение
Поройся в разделе было где-то
я бы через блок try {} catch {} делал.
Вчера копался нарыл 2 разных варианта

PowerShell
1
2
3
4
5
6
7
Move-Item $element.FullName -Destination $recurseSerchInstance.moveToDirectory -Force -ea 0
if($error.Count -eq 0) {
  # do something useful
}
else {
  # do something that doesn't involve spamming oneself
}
и вот такой варик:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$processFile = {    
    try {
        $filePath = $event.sourceEventArgs.FullPath
        [IO.File]::OpenRead($filePath).Close()
 
        #A Way to prevent false positive for really small files.
        if (-not ($newFiles -contains $filePath)) {
            $newFiles += $filePath
 
            #Process $filePath here...
        }
    } catch {
        #File is still being created, we wait till next event.
    }   
}
поможете адаптировать под ваш скрипт...
0
 Аватар для alhaos
1934 / 549 / 155
Регистрация: 20.02.2019
Сообщений: 2,675
Записей в блоге: 77
25.05.2021, 13:26
Порылся тоже, какая-то нетривиальная задача средствами PwSh определить процесс локирующий файл

Get-FileLockProcess.ps1

либо внешние утилиты подключать, наверное безе меня...
может кто путь проще знает.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2021, 13:26

Поиск файлов в папках и подпапках
Что неправильно в коде? Вобщем есть функция func(path, find), с помощью которой пытаюсь найти файл в папках и подпапках. static...

Поиск файлов в папках и подпапках
Подскажите как сделать поиск папок и под папках? Для поиска папок делаю так: static string sd =...

Поиск файлов в папках и подпапках
Здравствуйте! Есть задача, в которой необходимо выполнить вход во все папки и подпапки некой начальной директории. Для этого я решил...

Поиск в текстовом файле последовательностей цифр по шаблону и последующий их поиск в именах файлов (с логом)
Уважаемые программисты и хорошие люди! К Вам обращается украинский юрист. Очень нужен bat-файл или скрипт, который решает такую задачу: ...

Поиск в тексте DOC-файлов последовательностей символов по шаблону и поиск найденных в TXT-файле (с логом)
Уважаемые программисты! Очень нужен bat-файл или скрипт, который решает такую задачу: 1. Осуществляет поиск в тексте массива...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru