Il me faut donc trier plusieurs gros fichiers texte et supprimer toutes les occurrences de lignes contenant un mot clé donné. Donc, fondamentalement, si j'ai ces lignes:
Ce n'est pas un test
C'est un test
Peut-être un test
Certainement pas un test
Et je lance le script avec 'not', je dois supprimer entièrement les lignes 1 et 4.
J'ai essayé avec:
PS C:\Users\Admin> (Get-Content "D:\Logs\co2.txt") |
Foreach-Object {$_ -replace "3*Program*", ""} |
Set-Content "D:\Logs\co2.txt"
mais il ne fait que remplacer le "Programme" et non la ligne entière.
Voici ce que je ferais:
Get-Content .\in.txt | Where-Object {$_ -notmatch 'not'} | Set-Content out.txt
La ligne de Snark fait de même, mais elle commence par charger tout le fichier dans un tableau, ce qui peut poser problème avec les gros fichiers du point de vue de la mémoire.
Cela fonctionnera:
(Get-Content "D:\Logs\co2.txt") -notmatch "not" | Out-File "D:\Logs\co2.txt"
Vous pouvez également utiliser 'Select-String' avec l'option -notmatch:
Select-String 'not' .\input.txt -notmatch | % {$_.Line} | set-content output.txt
Je voulais juste que cela fonctionne et ai proposé ce qui suit:
$InServerName = 'SomeServerNameorIPAddress'
$InFilePath = '\Sharename\SomePath\'
$InFileName = 'Filename.ext'
$OutServerName = 'SomeServerNameorIPAddress'
$OutFilePath = '\Sharename\SomePath\'
$OutFileName = 'Filename.out'
$InFile = -join('\\',$InServerName,$InFilePath,$InFilename)
$OutFile = -join('\\',$OutServerName,$OutFilePath,$OutFilename)
$FindStr = 'some string to match on'
$CompareStr = [scriptblock]::Create($FindStr)
$CompareStr
Get-Content $InFile | Where-Object {$_ -notmatch $CompareStr} | Set-Content $OutFile
Get-Content $OutFile
La clé étant que 'Where-Object' utilisant un bloc de script (comme indiqué par les accolades) nécessite la déclaration de la variable dans un événement de création de bloc de script, d'où le
$CompareStr = [scriptblock]::Create($FindStr)
ligne.
En le structurant de cette manière, il est possible de créer une fonction, de lui transmettre une chaîne de texte à mettre partiellement en correspondance, d'effectuer la création du bloc de script avec la valeur transmise et de la faire fonctionner correctement.
Les réponses ci-dessus n'expliquent pas correctement comment passer la valeur à remplacer dans une variable.