2014-07-11 1 views
1

J'ai un dossier avec 50 sous-dossiers, dans ce sous-dossier sont une variété de fichiers texte différents. Qu'est-ce qu'un script PowerShell que je pourrais exécuter pour compter les caractères dans ces fichiers?Nombre de caractères dans plusieurs fichiers dans plusieurs dossiers

+0

Voulez-vous des comptes par dossier, par fichier ou simplement un total général? Est-ce que les espaces comptent comme des caractères? – mjolinor

+0

Dans le même ordre d'idée, la ponctuation compte-t-elle ou recherchez-vous uniquement un compte alphanumérique? – TheMadTechnician

Répondre

0

Est-ce que les costumes ci-dessous à vos besoins:

wc -l */* 

Ceci est une commande UNIX.

+0

wc n'est même pas une commande powershell, je ne vois pas comment c'est une réponse à sa question du tout. – TheMadTechnician

2
$results= @{} 
Get-ChildItem -Path C:\Temp -Filter *.txt -Recurse | ForEach-Object{ 

    $count = Get-Content $_.FullName | Measure-Object -Character 
    $results.Add($_.FullName, $count.Characters)} 
$results 

Sortie:

Name       Value                    
----       -----                    
C:\Temp\EventCombMT.txt  3724                    
C:\Temp\features.txt   222                     
C:\Temp\2test.txt    12                     
C:\Temp\winpe\realtekLan\no... 147 

Nom: Le chemin complet du fichier txt. Valeur: le nombre de mots. Je suis sûr qu'il existe, mais je ne pouvais pas trouver des informations sur la façon dont il calcule les caractères. Si vous avez besoin d'espaces pour NE PAS compter, il y a un commutateur -IgnoreWhiteSpace:$true

Le va prendre tous les fichiers txt dans le répertoire et les sous-répertoires de "c: temp". Le contenu de chaque fichier est acheminé dans Measure-Object pour compter les caractères. Le nom complet du fichier et son nombre de caractères sont placés dans une table de hachage. Dans cette forme, vous pouvez le manipuler davantage. Il y a d'autres choses que vous auriez pu faire bien sûr. C'était juste mon point de vue.

Pour plus d'informations sur hachage: http://technet.microsoft.com/en-us/library/ee692803.aspx

Mesure-objet http://blogs.technet.com/b/heyscriptingguy/archive/2011/10/09/use-a-powershell-cmdlet-to-count-files-words-and-lines.aspx

+0

Bien sûr, il y a d'autres façons de le faire, mais la vôtre est simple et efficace. Beaucoup mieux que ce que j'allais faire (le diviser en un tableau de personnage et compter de cette façon). – TheMadTechnician

0

L'applet de commande Get-Content sorties objets chaîne. La propriété « Longueur » des objets chaîne correspond au nombre de caractères dans une chaîne: http://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx

Vous pouvez donc contruct une propriété calculée appelée « Nombre de caractères » pour chacun de vos fichiers, comme ceci:

Get-ChildItem -Path C:\Test\*.txt -Recurse | 
Select-Object -Property Name, @{N="Number of Characters";E={ (get-content $_).length } } 

Output : 
Name      Number of Characters 
----      -------------------- 
New Text Document (2).txt     15 
New Text Document (3).txt     852 
New Text Document.txt      629 

Si vous voulez que le nombre total de caractères pour tous les fichiers txt dans le dossier, enregistrer la commande ci-dessus dans une variable ($ TextFiles, par exemple) et utiliser Mesure-objet:

$TextFiles | Measure-Object -Property "Number of Characters" -Sum 

sortie:

Count : 3 
Average : 
Sum  : 1496 
Maximum : 
Minimum : 
Property : Number of Characters 
+0

S'il y a plus d'une ligne dans le fichier, je crois (get-content $ _). Length va vous dire le nombre de lignes dans le fichier, plutôt que le nombre de caractères. – mjolinor

0

V4 en cours, je courais un concert quart des journaux vieux de courrier par ceci:

Get-ChildItem C:\maillogs\*3.s | 


foreach { 
      &{ 
      $ofs = '' 
      $Count=0 
      Get-Content $_ -ReadCount 1000 | 
      foreach { $count += ([string]$_).length } 
      [PSCustomObject]@{Name = $_.Name ; Count = $Count} 
      } 
     } | Format-Table -AutoSize 



Name      Count 
----      ----- 
[email protected] 98479479 
[email protected] 88578000 
[email protected] 754640 
[email protected] 61444158 
[email protected] 31823480 
[email protected] 633925 

en environ 22 secondes.

Questions connexes