Question Supprimer caratère Hexa

Plus d'informations
il y a 17 ans 2 semaines #4261 par physyo
Supprimer caratère Hexa a été créé par physyo
Bonjour les Powershelleur

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.

Plus d'informations
il y a 17 ans 2 semaines #4263 par Laurent Dardenne
Salut,
physyo écrit:

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

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.
physyo écrit:

Le 2ème problème c'est que je voudrai garder le même nom que la source

Dans ce cas il faut écrire le résultat du traitement dans un fichier temporaire puis le renommer, c'est le plus simple :
[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.

Plus d'informations
il y a 17 ans 2 semaines #4264 par physyo
Réponse de physyo sur le sujet Re:Supprimer caratère Hexa
Bonjour

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.

Plus d'informations
il y a 17 ans 2 semaines #4265 par Laurent Dardenne
Salut,
physyo écrit:

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.

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.

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.

Plus d'informations
il y a 17 ans 2 semaines #4266 par Laurent Dardenne
Le caractère que tu recherches est le 0x28 en hexa ou le 0x1C en hexa ?

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 1 semaine #4279 par Laurent Dardenne
Un début de solution, à vérifier je n'ai pas de jeu de test:
[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(\&quot;$CurrentFile\&quot; in Dir \&quot;$Path\FA*.txt\&quot;«»)
{
$TempFile = [IO.Path]::GetTempFileName()
Get-Content \&quot;$CurrentFile\&quot; -Encoding BYTE | Remove-LastChar $ASCIICode | Set-Content \&quot;$TempFile\&quot; -Encoding OEM
Move-Item -Path \&quot;$TempFile\&quot; -Destination \&quot;$CurrentFile\&quot;
}


#ou


# Sélectionner tous les fichiers FA*.txt
Dir \&quot;$Path\FA*.txt\&quot;|`
#pour chaque fichier
Foreach-Object
{
$TempFile = [IO.Path]::GetTempFileName()
# -lire chaque fichier octet par octets
Get-Content \&quot;$_.Fullname\&quot; -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 \&quot;$TempFile\&quot; -Encoding OEM

# -enregistrer le résultat dans un fichier texte de même nom
Move-Item -Path \&quot;$TempFile\&quot; -Destination \&quot;$_.Fullname\&quot;
}
[/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.

Temps de génération de la page : 0.115 secondes
Propulsé par Kunena