Практическое руководство для поиска текстовых файлов, скриптов, журналов, конфигураций и исходных файлов, в которых отсутствует нужное слово, фраза, параметр или строка.
Самый надежный встроенный способ — PowerShell. Откройте Windows Terminal или PowerShell, измените путь к папке и выполните команду:
PowerShell$folder = "C:\Users\User\Documents"
$text = "required text"
Get-ChildItem -Path $folder -Recurse -File |
Where-Object {
-not (Select-String -Path $_.FullName -Pattern $text -SimpleMatch -Quiet)
} |
Select-Object FullName
$text.
Select-String — команда PowerShell для поиска текста внутри файлов. Параметр -Quiet возвращает только факт наличия совпадения. Оператор -not инвертирует результат, поэтому Windows выводит файлы, в которых текст не найден.
Такой поиск отличается от обычного поиска по имени файла. Windows должна открыть каждый подходящий файл, прочитать его содержимое и проверить, есть ли внутри нужный текст.
.ini, .conf и .json.html, .css и .jsИспользуйте этот способ, когда нужен чистый список файлов, в которых отсутствует одно слово, параметр, тег, имя класса, домен или другой точный фрагмент.
$folder на папку, которую нужно проверить.$text на слово или фрагмент, отсутствие которого нужно найти.PowerShell$folder = "D:\Articles"
$text = "canonical"
Get-ChildItem -Path $folder -Recurse -File |
Where-Object {
-not (Select-String -Path $_.FullName -Pattern $text -SimpleMatch -Quiet)
} |
Select-Object FullName
В этом примере PowerShell выводит файлы в папке D:\Articles, которые не содержат текст canonical.
Для точной фразы оставьте параметр -SimpleMatch. Он сообщает Select-String, что поисковый текст нужно обрабатывать как обычный текст, а не как регулярное выражение.
PowerShell$folder = "C:\Users\User\Desktop\Pages"
$text = "Table of contents"
Get-ChildItem -Path $folder -Recurse -File |
Where-Object {
-not (Select-String -Path $_.FullName -Pattern $text -SimpleMatch -Quiet)
} |
Select-Object FullName
-SimpleMatch при поиске обычного текста: заголовка, CSS-класса, пункта меню или доменного имени. Без этого параметра точки, скобки, вопросительные знаки и другие символы могут восприниматься как синтаксис регулярного выражения.
Для больших папок сначала отфильтруйте расширения файлов. Это ускоряет поиск и исключает множество бинарных файлов.
*.html
Журналы: *.log
Скрипты: *.ps1
Текстовые файлы: *.txt
PowerShell — одно расширение$folder = "D:\Site"
$text = "style2.css"
Get-ChildItem -Path $folder -Recurse -File -Filter *.html |
Where-Object {
-not (Select-String -Path $_.FullName -Pattern $text -SimpleMatch -Quiet)
} |
Select-Object FullName
Чтобы проверить несколько расширений, используйте -Include вместе с путем с подстановочным знаком:
PowerShell — несколько расширений$folder = "D:\Site\*"
$text = "text-mark"
Get-ChildItem -Path $folder -Recurse -File -Include *.html,*.css,*.js |
Where-Object {
-not (Select-String -Path $_.FullName -Pattern $text -SimpleMatch -Quiet)
} |
Select-Object FullName
-Include используйте путь с подстановочным знаком, например D:\Site\*. Иначе PowerShell может применить фильтр включения не так, как ожидается.
По умолчанию Select-String не учитывает регистр. Если нужно различать Error, ERROR и error, добавьте -CaseSensitive.
PowerShell$folder = "C:\Logs"
$text = "ERROR"
Get-ChildItem -Path $folder -Recurse -File -Filter *.log |
Where-Object {
-not (Select-String -Path $_.FullName -Pattern $text -SimpleMatch -CaseSensitive -Quiet)
} |
Select-Object FullName
Эта команда выводит файлы .log, которые не содержат точную строку в верхнем регистре ERROR.
При поиске в проектах часто нужно пропустить папки кэша, зависимостей, сборки или контроля версий. Их можно исключить, проверяя полный путь перед сканированием каждого файла.
PowerShell$folder = "D:\Project"
$text = "apiKey"
$excluded = "\node_modules\", "\.git\", "\bin\", "\obj\"
Get-ChildItem -Path $folder -Recurse -File -Include *.js,*.json,*.html,*.css |
Where-Object {
$file = $_.FullName
-not ($excluded | Where-Object { $file -like "*$_*" })
} |
Where-Object {
-not (Select-String -Path $_.FullName -Pattern $text -SimpleMatch -Quiet)
} |
Select-Object FullName
Это удобно для папок сайтов, программных проектов, экспортированной документации и больших архивов текстовых файлов.
findstr умеет находить файлы, которые содержат текст, но не формирует напрямую удобный список «файлов без этого текста» при рекурсивном поиске. Практичный обходной вариант со встроенными средствами — создать два списка и сравнить их через PowerShell.
Используйте dir, чтобы вывести файлы с нужным расширением.
Используйте findstr с параметром /m, чтобы получить файлы, где текст найден.
Используйте PowerShell, чтобы вывести файлы, которые есть в первом списке, но отсутствуют во втором.
Командная строкаcd /d D:\Articles
dir /b /s *.html > all-files.txt
findstr /m /s /i /c:"Table of contents" *.html > files-with-text.txt
powershell -NoProfile -Command "$all=Get-Content .\all-files.txt; $yes=Get-Content .\files-with-text.txt; Compare-Object $all $yes | Where-Object SideIndicator -eq '<=' | Select-Object -ExpandProperty InputObject"
findstr, если уже работаете в Командной строке. Для новых задач чистый способ на PowerShell короче и проще в поддержке.
Проводник — не лучший инструмент для этой задачи. Он может искать имена файлов и индексированное содержимое, но надежный рекурсивный поиск «покажи файлы, в содержимом которых нет этого текста» лучше выполнять через PowerShell.
| Инструмент | Для чего подходит | Слабое место |
|---|---|---|
| Проводник | Быстрый поиск по именам файлов и индексированному содержимому. | Ненадежен для полной проверки содержимого на отсутствие текста. |
| PowerShell | Рекурсивное сканирование реального содержимого файлов и фильтрация результатов. | Требует команды и может работать медленно на очень больших папках. |
findstr |
Простой поиск из Командной строки по обычным текстовым файлам. | Менее удобен для обратного поиска и сложной фильтрации. |
Если нужны только файлы, которые содержат слово, Проводника может быть достаточно. Если нужны файлы, где этого слова нет, используйте PowerShell.
Сначала ищите в собственных папках документов, проектов или сайтов. Не сканируйте весь диск C:\, если PowerShell не запущен от имени администратора и вы не готовы к ошибкам на защищенных папках.
PowerShell — скрыть ошибки доступа и чтенияGet-ChildItem -Path "C:\Users\User\Documents" -Recurse -File -ErrorAction SilentlyContinue |
Where-Object {
-not (Select-String -Path $_.FullName -Pattern "required text" -SimpleMatch -Quiet -ErrorAction SilentlyContinue)
} |
Select-Object FullName
-Filter или -Include, чтобы ограничить расширения файлов.Оставьте включенным параметр -SimpleMatch. Это особенно важно для фрагментов вроде URL-адресов, CSS-селекторов, строк, похожих на ключи реестра, фрагментов кода и имен файлов с точками.
Select-String и инвертировать совпадение с помощью -not.
$patterns = "word1", "word2", и передайте $patterns в -Pattern. Если нужны файлы, где отсутствуют все обязательные слова, или файлы, где отсутствует хотя бы одно из них, измените логику проверки соответственно.
Select-String предназначен для текстовых потоков и обычных текстовых файлов. PDF, DOCX и похожие форматы требуют специализированного разбора или отдельных поисковых инструментов.
.txt, .log, .html, .css, .js, .xml и .json.
| Out-File missing-text-files.txt -Encoding UTF8 в конец команды PowerShell, чтобы сохранить список.
Чтобы найти файлы, которые не содержат заданный текст, используйте PowerShell с Select-String. Этот способ дает прямой контроль над папкой, расширениями файлов, точным совпадением фразы, учетом регистра и исключенными папками.
Используйте Проводник для быстрых поисков по имени или индексированному содержимому, но выбирайте PowerShell, когда нужен надежный список файлов, где отсутствует обязательное слово, фраза, заголовок, тег или строка конфигурации.