Question
Supprimer caratère Hexa
- physyo
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 22
- Remerciements reçus 0
Voici ma problématique.
Je dois convertir des fichiers texte qui commence tous par FA* en oem.
jusque la j'ai réussi à les convertir de cette façon.
[code:1]Get-Content -path C:\test\source.txt | Out-File C:\test\destination.txt -Encoding oem[/code:1]
Mais,
Le 1er problème c'est que je ne sais pas comment faire pour convertir tout les fichiers en une seul fois avec un foreach
Le 2ème problème c'est que je voudrai garder le même nom que la source
Et enfin le dernier problème qui est bien pénible c'est que à la fin de chaque fichier j'ai un caractère hexa que je dois supprimer.
Avec un get-content -encoding byte je trouve la valeur \"28\" de ce caractère hexa que j’arrive à supprimé
[code:1]get-content C:\test\source.txt -Encoding byte | where {$_ -notmatch \"28\"} | Out-File C:\test\destination.txt -Encoding oem [/code:1]
Mais le fichier de destination reste en codage byte
Avez-vous une idée ?
Merci pour votre aide.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
physyo écrit:
Pour ce type de question il te faut déjà rédiger toutes les actions à effectuer. Ensuite l'écriture de la suite d'instruction s'en trouvera faciliter puisqu'il restera la pluspart du temps à mettre en correspondance une action avec le cmdlet adéquate.Le 1er problème c'est que je ne sais pas comment faire pour convertir tout les fichiers en une seul fois avec un foreach
physyo écrit:
Dans ce cas il faut écrire le résultat du traitement dans un fichier temporaire puis le renommer, c'est le plus simple :Le 2ème problème c'est que je voudrai garder le même nom que la source
[code:1]
$TempFile = [IO.Path]::GetTempFileName()
#traitement sur \"$CurrentFile\"
Move-Item -Path \"$TempFile\" -Destination \"$CurrentFile\"
Del \"$TempFile\"
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- physyo
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 22
- Remerciements reçus 0
Merci pour ta réponse.
Je vais tester ta ligne de code.
Enfaite ce que je voudrai faire. c'est convertir une liste de plusieurs fichiers txt en encodage oem et supprimer le caractère hexa qui ce trouve à la fin de chaque fichier.
je vais essayer faire le script foreach avec la convertion oem il me manque juste l'astuce pour supprimer le caractère.
Merci pour ton d'aide
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
physyo écrit:
J'ai bien compris mais je pensais qu'il vallait mieux que tu comprennes le principe de rédaction d'une suite d'instructions à l'aide du pipeline plutot que de te donner une solution.Enfaite ce que je voudrai faire. c'est convertir une liste de plusieurs fichiers txt en encodage oem et supprimer le caractère hexa qui ce trouve à la fin de chaque fichier.
Pour le dernier caractère ta manière de faire :
[code:1]where {$_ -notmatch \"28\"} [/code:1]
filtre TOUS les caractères jugés indésirable et pas uniquement le dernier.
L'énoncé complet d'un pb est important car on trouvera plus facilement la correspondance en terme de syntaxe PowerShell.
Une partie de l'énoncé tel que \"le dernier caractère\" peut correspondre à ceci :
[code:1]Select-Object -Last[/code:1]
Un exemple d'énoncé et de correspondance, certe dans un contexte différent, mais le principe reste le même :
[code:1]
# Recherche tous les fichiers Winform d'une arborescence
# le nom fini uniquement par \".Designer.cs\"
# Le début peut être quelconque = *
# sauf = *.ascx.designer.cs
# sauf = *.aspx.designer.cs
# sauf les fichiers des répertoires dont le nom finit par \"Properties\", donc :
# sauf = Ressources.designer.cs
# sauf = Settings.designer.cs
#
#Segment 1 : Recherche tous les fichiers Winform d'une arborescence, on exclut ceux des projets WEB
Get-ChildItem -recurse -include *.Designer.cs -exclude *.as[cp]x.designer.cs|`
#Segment 2 : On exclut les fichiers contenus dans les répertoires dont le nom se termine par Properties
Where-Object {(Split-Path ($_).Fullname) -notmatch 'Properties$'}|`
#Segment 3 : On émet le nom complet des fichiers trouvés
ForEach-Object {($_).Fullname}
[/code:1]
Je pense qu'un filtre pourrait aussi faire l'affaire, voir ce post .<br><br>Message édité par: Laurent Dardenne, à: 6/03/09 15:18
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
[code:1]
# Sélectionner tous les fichiers FA*.txt
# pour chaque fichier
# -lire chaque fichier octet par octets
# -supprimer le dernier caractère si celui-ci est égal à 0x1c (28) = File Separator
# -enregistrer le résultat dans un fichier texte de même nom et avec l'encodage OEM
function Remove-LastChar([byte]$ASCIICode){
#Supprime le dernier élément de la collection reçue via le pipeline
#Une fonction sans bloc (begin, process, end) est considérée comme une fonction déclarant uniquement le bloc End
#Dans ce cas on attend de recevoir tous les objets du pipeline, issu du segment précédent, avant de continuer le traitement.
#Tous les éléments sont accessible dans la variable automatique $input, accessible uniquement dans le bloc End
#Par exemple pour trier une collection on doit connaitre auparavant l'ensemble de ces éléments.
$ArrayOfChars=@($input) #Cast d'input en un tableau. A l'origine $input est une énumération, pas une collection indexée
$LastItem=$ArrayOfChars.Count-1
if ($ArrayOfChars[$LastItem] -eq $AsciiCode)
#Réemet tous les élements sauf le dernier
{ $ArrayOfChars[0..($LastItem-1)] }
else
#Réemet tous les élements
{ $ArrayOfChars }
}
$Path=$Pwd
$ASCIICode=0x1C
Foreach(\"$CurrentFile\" in Dir \"$Path\FA*.txt\"«»)
{
$TempFile = [IO.Path]::GetTempFileName()
Get-Content \"$CurrentFile\" -Encoding BYTE | Remove-LastChar $ASCIICode | Set-Content \"$TempFile\" -Encoding OEM
Move-Item -Path \"$TempFile\" -Destination \"$CurrentFile\"
}
#ou
# Sélectionner tous les fichiers FA*.txt
Dir \"$Path\FA*.txt\"|`
#pour chaque fichier
Foreach-Object
{
$TempFile = [IO.Path]::GetTempFileName()
# -lire chaque fichier octet par octets
Get-Content \"$_.Fullname\" -Encoding BYTE|`
# -supprimer le dernier caractère si celui-ci est égal à 0x1c (28) = File Separator
Remove-LastChar $ASCIICode|`
# -enregistrer le résultat dans un fichier avec l'encodage OEM.
Set-Content \"$TempFile\" -Encoding OEM
# -enregistrer le résultat dans un fichier texte de même nom
Move-Item -Path \"$TempFile\" -Destination \"$_.Fullname\"
}
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 9/03/09 13:07
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Supprimer caratère Hexa