Я борюсь с довольно простой задачей CMD.
У меня есть корневая папка (C:\folder), в которой много подпапок, каждая из которых содержит файлы разного типа. Я хочу выполнить поиск по всем txt-файлам во всех подпапках, чтобы найти URL-ссылки. В конце я хочу поместить все ссылки в один файл. Мое регулярное выражение для поиска URL-адреса выглядит так:
(https?|ftp|file)://\)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
и это работает
Моя последняя идея была:
for /R C:\folder %%F in (*.txt) do (
findstr /r "(https?|ftp|file)://\)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]" >> results.txt
)
Вы можете помочь мне? Что мне не хватает?
переход с /r
на /R
ничего не изменил
Кажется вероятным, что обработка регулярных выражений findstr.exe
не полностью поддерживает все используемые функции. Кроме того, findstr.exe
необходимо указать, какой файл он должен читать.
Я не уверен, что это регулярное выражение является универсальным идентификатором URL-адреса, но если вы хотите поместить его в команду PowerShell:
Get-ChildItem -Recurse -File -Filter '*.txt' |
Select-String -Pattern '(https?|ftp|file)://\)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]'
Как предложил @mklement0:
Get-ChildItem -Recurse -File -Filter '*.txt' |
Select-String -Pattern '(https?|ftp|file)://\)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]' |
ForEach-Object { $_.Matches.Value }
и:
Get-ChildItem -Recurse -File -Filter '*.txt' |
Select-String -Pattern '(https?|ftp|file)://\)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]' |
ForEach-Object { $_.Matches.Value } >results.txt
Я бы не стал помещать файл results.txt
в тот же каталог, поскольку он будет включен, если команда будет запущена еще раз. Возможно, разместив его в домашнем каталоге.
Get-ChildItem -Recurse -File -Filter '*.txt' |
Select-String -Pattern '(https?|ftp|file)://\)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]' |
ForEach-Object { $_.Matches.Value } |
Out-File -Path '~/results.txt'
Я подумал, что вам нужно использовать
/R
для регулярного выражения (на данный момент у меня нет доступа к машине с Windows, чтобы проверить)