Как найти файлы, содержащие «строку A» и НЕ содержащие «строку B», и вывести их имена в файл?

990
thecoolmacdude

Я смотрел на этот другой вопрос, но не был уверен, как объединить эти запросы вместе.

Я начал с этого, но это, похоже, не работает:

findstr /S /M "string A" *.vb | findstr /S /M /V "string B" > output.txt 

Например, я хочу получить список файлов, содержащих «строку A», но НЕ «строку B».

Я хотел бы использовать командную строку Windows, если это возможно, или Windows PowerShell.

0
Я знаю, что у вас есть ссылка на cmd, но powershell находится прямо на вашем компьютере с Windows7 и может быть установлен и для предыдущих версий. Так как вы выразили это предпочтение, я дам это в качестве комментария вместо ответа: `ls. \ *. Vb | Строка выбора A | Выбор пути к объекту - уникальный | Where-Object {! (Select-String -InputObject $ _ -Pattern B)} ` EBGreen 5 лет назад 0
@EBGreen Я изменю свой вопрос, чтобы также разрешать ответы в PowerShell, чтобы вы могли публиковать их в качестве ответа. Я не получаю никаких результатов, однако. Это поиск подпапок? thecoolmacdude 5 лет назад 0

1 ответ на вопрос

1
EBGreen

Это должно сделать это в powershell:

Get-ChildItem .\*.vb | Select-String A | Select-Object path -unique | Where-Object{!(Select-String -InputObject $_ -Pattern B)} 

Чтобы включить подпапки:

Get-ChildItem .\*.vb -Recurse | Select-String A | Select-Object path -unique | Where-Object{!(Select-String -InputObject $_ -Pattern B)} 

Я не уверен, что ваш конкретный пример отличается от моего макета, но, используя ваши конкретные условия поиска, попробуйте это:

Get-ChildItem .\*.vb -Recurse | Select-String HttpDelete | Select-Object path -unique | Where-Object{!(Select-String -InputObject (Get-Content $_.Path) -Pattern securityEntityPermission)} 
Кажется, это находит файлы, содержащие строку «A», но не исключает также файлы, содержащие строку «B» (если они содержат строку «A»). thecoolmacdude 5 лет назад 0
Да, поэтому я обдумал тестовый сценарий с 6 файлами. У двоих был А, но нет Б. У двоих был Б, но нет А. У двоих А и В. То, что я написал, вернуло только два с одним только A. Что вы на самом деле исполняете? EBGreen 5 лет назад 0
Я запускаю это из каталога, в котором я хочу выполнить его: Get-ChildItem. \ *. Vb -Recurse | Select-String "HttpDelete" | Выбор пути к объекту - уникальный | Where- Object {! (Select-String -SimpleMatch -InputObject $ _ -Pattern "securityEntityPermission")} По-прежнему, похоже, мне возвращаются файлы, которые имеют securityEntityPermission в самих файлах, когда я не хочу, чтобы эти файлы возвращались. Я попытался использовать приложение Agent Ransack и смог получить правильные файлы, поэтому я не уверен, почему это не работает. thecoolmacdude 5 лет назад 0
Проверьте редактирование. EBGreen 5 лет назад 0
Да, так и было! Спасибо! thecoolmacdude 5 лет назад 0