Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185

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

21.05.2021, 14:02. Показов 4043. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru