Extraire les lignes correspondant à un modèle à partir de tous les fichiers texte dans un dossier en un seul fichier de sortie
Je suis en train d'extraire chaque ligne commençant par "%%" dans tous les fichiers dans un dossier et ensuite copier ces lignes dans un fichier texte séparé. Actuellement en utilisant ce code dans PowerShell code, mais je n'obtiens pas de résultats.
$files = Get-ChildItem "folder" -Filter *.txt
foreach ($file in $files)
{
if ($_ -like "*%%*")
{
Set-Content "Output.txt"
}
}
Utilisé ce code, je suis en train de faire quelque chose de vraiment mauvais ici $fichiers = Get-ChildItem "DOSSIER" -Filtre *.txt foreach ($fichier $files) { (Select-String -Chemin *.txt -Modèle"^%%').Ligne | Set-Content "Output.txt" }
OriginalL'auteur Jabir Jamal | 2016-12-09
Vous devez vous connecter pour publier un commentaire.
Je pense que mklement0 la suggestion d'utiliser
Select-String
est le chemin à parcourir. Ajoutant à sa réponse, vous pouvez rediriger la sortie deGet-ChildItem
dans leSelect-String
de sorte que l'ensemble du processus devient une Powershell un liner.Quelque chose comme ceci:
OriginalL'auteur Dave Sexton
La
Select-String
applet de commande offre une solution beaucoup plus simple (PSv3+ syntaxe):Select-String
accepte un nom de fichier/parcours par l'intermédiaire de son-Path
paramètre, donc, dans ce cas simple, il n'est pas nécessaire pourGet-ChildItem
.Get-ChildItem
's la sortie deSelect-String
, comme l'a démontré Dave Sexton est de répondre de façon utile.Select-String
par défaut suppose que les fichiers d'entrée sont codé en UTF-8, mais vous pouvez changer cela avec la-Encoding
paramètre; aussi envisager la sortie encodage discuté ci-dessous.Select-String
's-Pattern
paramètre attend un expression régulière plutôt qu'une expression générique.^%%
seules les correspondances littérales%%
à la commencer (^
) d'une ligne.Select-String
sorties[Microsoft.PowerShell.Commands.MatchInfo]
objets qui contiennent des informations sur chaque match; chaque objet.Line
propriété contient le texte intégral d'une ligne d'entrée correspondant.Set-Content Output.txt
envoie toutes les lignes correspondants à un seul fichier de sortieOutput.txt
Set-Content
utilise le système de l'héritage de Windows page de code (8 bits d'un octet codant - même si le la documentation à tort claims qui ASCII fichiers sont produits).Si vous souhaitez contrôler l'encodage de sortie explicitement, utilisez le
-Encoding
paramètre; par exemple,... | Set-Content Output.txt -Encoding Utf8
.>
, la redirection de la sortie de l'opérateur toujours crée UTF-16LE fichiers (un encodage PowerShell appelsUnicode
), comme le faitOut-File
par défaut (qui peut être changé avec-Encoding
).Notez également que
>
/Out-File
appliquer PowerShell est mise en forme par défaut pour les objets d'entrée pour obtenir la représentation de chaîne d'écrire dans le fichier de sortie, alors queSet-Content
traite l'entrée comme chaînes (appels.ToString()
sur les objets d'entrée, si nécessaire). En l'espèce, puisque tous les objets d'entrée sont déjà des chaînes, il n'y a pas de différence (sauf pour le codage des caractères, peut-être).Comme pour ce que vous avez essayé:
$_
à l'intérieur de votreforeach ($file in $files)
se réfère à un fichier (un[System.IO.FileInfo]
objet), de sorte que vous êtes effectivement à l'évaluation de votre expression générique*%%*
contre le fichier d'entrée est nom plutôt que son contenu.À côté de cela, le modèle générique
*%%*
correspondra%%
n'importe où dans la chaîne d'entrée, et pas seulement à ses commencer (vous auriez à utiliser%%*
à la place).La
Set-Content "Output.txt"
appel est manquant entrée, parce qu'il ne fait pas partie d'un pipeline et, en l'absence de pipeline d'entrée, pas de-Value
argument a été adoptée.Output.txt
serait d'obtenir réécrit comme un ensemble de dans chaque itération de votreforeach
boucle.OriginalL'auteur mklement0
Alias
http://ss64.com/ps/
OriginalL'auteur Shantanu Gupta
Vous devez d'abord utiliser
afin d'obtenir le contenu du fichier. Ensuite, vous faites la chaîne de match et sur cette base vous de nouveau définir le contenu dans le fichier. Utilisation get-content et mettre une autre boucle à l'intérieur de la foreach à la parcourir toutes les lignes dans le fichier.
J'espère que cette logique permet de vous
OriginalL'auteur Ranadip Dutta