Vos exigences sont un peu vagues. La chaîne "USER" peut apparaître dans plusieurs contextes. Plus vous êtes précis quant au format de ligne attendu, meilleure est la solution.
Une solution sensible à la casse utilisant des commandes batch natives serait un peu délicate.
Voici une solution de traitement par lots native qui n’est pas sensible à la casse. Il recherche le mot "USER" (insensible à la casse) au début d'une ligne ou après un espace, suivi d'un espace. Il ignore ensuite un ou plusieurs espaces (ou tabulations), puis écrit la chaîne suivante jusqu'à l'espace, la tabulation ou la fin de ligne.
@echo off
setlocal disableDelayedExpansion
pushd "pathToYourFolder"
>userNames.txt (
for /f delims^=^ eol^= %%A in ('findstr /ri /c:" USER " /c:" USER " *.txt') do (
set "ln=%%A"
setlocal enableDelayedExpansion
set "ln=!ln:*:=!"
if /i "!ln:~0,5!" equ "USER " (set "ln=!ln:~5!") else set "ln=!ln:* USER =!"
for /f %%B in ("!ln!") do if "%%B" neq "" echo %%B
endlocal
)
)
popd
La vie est bien meilleure si vous vous permettez d'aller au-delà des commandes batch natives. Ce qui suit utilise REPL.BAT - un utilitaire hybride JScript / batch qui effectue une recherche d’expression régulière et remplace les lignes de stdin et écrit le résultat dans stdout . C'est un script pur qui s'exécute de manière native sur n'importe quelle machine Windows moderne à partir de XP.
Le script ci-dessous suppose que REPL.BAT se trouve quelque part dans votre CHEMIN. Il recherche le mot USER (sensible à la casse) suivi d'un ou de plusieurs caractères d'espacement (le plus souvent d'espaces et / ou de tabulations), puis écrit la "chaîne" suivante jusqu'à un autre caractère d'espacement. Il est fort probable que l'expression régulière puisse être modifiée si nécessaire si vous définissez mieux vos besoins.
pushd "pathToYourFolder"
findstr USER *.log|repl ".*?:.*\bUSER\s+(\S+).*" $1 a >userNames.txt
popd
Pas vraiment une solution en chauve-souris classique. Powershell:
la source