Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
-7 / 0 / 0
Регистрация: 05.10.2017
Сообщений: 49

Filter файлов или досовская маска файлов и проверка регулярным -like *.*

21.11.2025, 15:17. Показов 544. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. filter файлов или досовская маска файлов и проверка регулярным -like дают разный результат если имя файла/папки не имеет расширения. Из-за это в коде происходила ошибка:
PowerShell
1
2
3
4
5
$mask = "*.*"
$pathMy = "C:\22"
Get-ChildItem -path $pathMy -Filter $mask | ForEach-Object {
    "$($_.Name) - $($_.Name -like $mask)"
}
Если в каталоге C:\22 есть файлы не имеющие расширения, то с маской "*.*" Get-ChildItem -Filter $mask находит соответствие имени файла маске файла (true), но в ($_.Name -like $mask) - нет (false). Конечно есть несколько, на мой взгляд, корявых методов это исправить, но, возможно, существует на этот счет в Powershell (или .NET) какое-то стандартное решение.
Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.11.2025, 15:17
Ответы с готовыми решениями:

Копирование файлов в папки по маске файла и маске папки
Добрый день! Товарищи, помогите. Возникла надобность раскладывать файлы по маске папки и маске...

Проверка наличия файла по маске
Подскажите, пожалуйста, как подправить этот батник: @echo off for %%i in ("345*_*.txt") do...

Настройка RRAS ip filter Windows server 2016/2019
Подскажите как можно настроить access list именно с помощью RRAS inbound/outbound filter для...

4
 Аватар для volodin661
6674 / 2267 / 346
Регистрация: 10.12.2013
Сообщений: 7,836
21.11.2025, 16:10
с опцией -Filter довольно туманная история.
В документации было сказано, что маска передаётся сразу FileSystem-провайдеру и ничего не проверяется потом, по возврату результата от провайдера, тем самым экономится память и побыстрее работает.
Потом в каких-то статьях утверждалось, что в pwsh это стало уже не так и скорость одинаковая.

маска <*.*> для опции -Filter бессмысленна, как мне представляется.

-like к регулярным выражениям отношения не имеет и его применение для постобработки тоже смысла не имеет.
2
-7 / 0 / 0
Регистрация: 05.10.2017
Сообщений: 49
21.11.2025, 18:16  [ТС]
Блин скоро форумы придется закрывать. Вот что мне по этому поводу сказал ChatGPT:
Наблюдаемое поведение — нормальное, и вполне объяснимое:

Get-ChildItem -Filter обрабатывает маски не тем же механизмом, что оператор -like.

-Filter использует API файловой системы Windows (FindFirstFile / FindNextFile), где маска *.* означает:
→ «имя содержит точку в любом месте, необязательно как разделитель расширения».

Оператор -like использует wildcard-механизм PowerShell, где *.* означает:
→ «есть хотя бы один символ, затем точка, затем хотя бы один символ».

То есть файл test (без точки)

Windows API: matched (*.* → TRUE)

PowerShell -like "*.*": NOT matched (нет точки → FALSE)

Отсюда и несоответствие.

...

Да, в PowerShell есть корректный способ повторить поведение Get-ChildItem -Filter, не изобретая костыли:

PowerShell
1
2
3
4
5
6
7
8
9
$mask = "*.*"
$pattern = [System.Management.Automation.WildcardPattern]::new(
    $mask,
    [System.Management.Automation.WildcardOptions]::FileSystem
)
 
Get-ChildItem C:\22 -Filter $mask | ForEach-Object {
    "{0} - {1}" -f $_.Name, $pattern.IsMatch($_.Name)
}
2 volodin661
Спасибо.

Добавлено через 26 минут
Якобы рабочий код для PowerShell 2.0 от ChatGPT, но тоже нерабочий в моем Powershell 5.1 :

PowerShell
1
2
3
4
5
6
$mask = "*.*"
$pattern = New-Object System.Management.Automation.WildcardPattern $mask
 
Get-ChildItem C:\22 -Filter $mask | ForEach-Object {
    "{0} - {1}" -f $_.Name, $pattern.IsMatch($_.Name)
}
Добавлено через 1 час 13 минут
Добил я, наконец, ChatGPT, 4 раза мне нерабочий код выдавал, с той или иной ошибкой. И вот итог нашей с AI совместной работы:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$mask = "*.*"
$pathMy = "C:\22"
 
if(-not ('WinApi.Shlwapi' -as [System.Type])) {
    Add-Type -TypeDefinition @'
namespace WinApi {
    using System;
    using System.Runtime.InteropServices;
 
    public static class Shlwapi {
        [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, SetLastError = false)]
        public static extern bool PathMatchSpec(string pszFileParam, string pszSpec);
    }
}
'@
}
 
Get-ChildItem -path $pathMy -Filter $mask -Force | ForEach-Object {
    "$($_.Name) - $([WinApi.Shlwapi]::PathMatchSpec($_.Name, $Mask))"
}
Добавлено через 10 минут
DeepSeek дал мне 4 возможных варианта решения вопроса, один из которых оказался приемлем, без всяких правок:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Add-Type @"
using System;
using System.Runtime.InteropServices;
 
public class FileMaskHelper {
    [DllImport("shlwapi.dll", CharSet = CharSet.Auto)]
    public static extern bool PathMatchSpec(string file, string spec);
    
    public static bool MatchesMask(string fileName, string mask) {
        return PathMatchSpec(fileName, mask);
    }
}
"@
 
$mask = "*.*"
$pathMy = "C:\22"
 
Get-ChildItem -Path $pathMy -Force | Where-Object { 
    [FileMaskHelper]::MatchesMask($_.Name, $mask)
}
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
21.11.2025, 19:00
Gouru, Если задача икс исключить файлы без расширения можно сделать так

PowerShell
1
Get-ChildItem | Where-Object {!$_.PSIsContainer -and $_.Extension}
Добавлено через 6 минут
И продолжать пользоваться маской, если это необходимо

PowerShell
1
2
$mask = '*.*'
Get-ChildItem -Filter $mask | Where-Object {!$_.PSIsContainer -and $_.Extension}
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
22.11.2025, 10:50
Можно сразу отсечь директории:

PowerShell
1
Get-ChildItem -File | Where-Object { $_.Extension }
Или применить -match

PowerShell
1
(Get-ChildItem -File) -match '\.\w+$'
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.11.2025, 10:50
Помогаю со студенческими работами здесь

get-aduser multiple filter
всем привет. есть строка, содержащая samaccountname или почту пользователей. Как правильно...

Проверка переменной по маске
Есть переменная str. Как проверить соответствует ли она маске 0000:00:00??? Если да, то дальше идет...

Как можно упростить like для 2 значений?
подскажите, пожалуйста, синтаксис как можно упростить Get-ADUser -Filter {(City -like &quot;Moscow&quot;)...

Использование регулярных выражений для проверки введённой строки на наличие определённых символов
Подскажите как реализовать: Нужно чтобы при указании имени папки скрипт проверял его на...

Найти файл по маске, в нём найти определённую запись и вывести её в текстовый файл на "Рабочий стол"
Доброго Времени Суток Всем! Задача, собственно, сам сабж.:) Половина решения уже вроде как...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru