Précédent   Forum du club des développeurs et IT Pro > Général Développement > Programmation système > Windows > Scripts/Batch
Scripts/Batch Forum d'entraide sur la programmation de scripts Batch et Powershell sous Windows.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/12/2012, 12h17   #1
Altrensa
Nouveau Membre du Club
 
Étudiant
Inscription : juillet 2007
Messages : 113
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 113
Points : 39
Points : 39
Par défaut Copie de plus de 4096 caractères par ligne

Bonjour à tous,

Je croyais que la solution que j'évoquais dans mon post de ce matin (disponible ici) avait tout réglé mais il reste un petit détail...

Quand j'utilise le code suivant, les lignes contenant la chaine sont copiées dans le fichier de sortie... mais seulement jusqu'au 4096ème caractère...
Code :
Find %CHAINE% %FILE% >>%FILE_SORTIE%
Si vous avez une solution pour outrepasser cette limite (ou pour en fixer une autre), je vous en serai très reconnaissant.

Bon appétit à tous,

Altrensa
Altrensa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 14h02   #2
Altrensa
Nouveau Membre du Club
 
Étudiant
Inscription : juillet 2007
Messages : 113
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 113
Points : 39
Points : 39
Note additionnelle : Ce qui est bizarre, c'est que les lignes sont coupées à 4096 mais que la ligne suivante est écrite à partir de la 4097ème position de la ligne inachevée.

Ainsi, les lignes ("|" est à la 4096ème position) :
Code :
1
2
[....]PAS|FINLIGNE1[...]
LIGNE2
Deviennent :
Altrensa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 21h11   #3
ludo40190
Membre actif
 
Homme Ludo
Administrateur systèmes et réseaux
Inscription : juin 2011
Messages : 141
Détails du profil
Informations personnelles :
Nom : Homme Ludo
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juin 2011
Messages : 141
Points : 178
Points : 178
avec un petit "|" et un "sort" ça doit pouvoir le faire...
ludo40190 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 11h09   #4
Altrensa
Nouveau Membre du Club
 
Étudiant
Inscription : juillet 2007
Messages : 113
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 113
Points : 39
Points : 39
Bonjour Ludo40190,

Merci pour ce retour... Mais le post précédent n'était là qu'à titre d'exemple. En effet, je ne connais pas à l'avance le 4096ème caractère de chaque ligne. Il m'est donc impossible d'effectuer une découpe au caractère.

De plus, vu que la variable de ma boucle for ne contient que les 4096 premiers caractères, je ne sais pas comment récupérer la fin de la ligne en cours de lecture... Si je pouvais récupérer, dans chaque itération, les éléments suivant ces 4096 caractères, cela résoudrait mon problème...

Merci quand même

Bien cordialement,

Altrensa
Altrensa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 21h33   #5
ludo40190
Membre actif
 
Homme Ludo
Administrateur systèmes et réseaux
Inscription : juin 2011
Messages : 141
Détails du profil
Informations personnelles :
Nom : Homme Ludo
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juin 2011
Messages : 141
Points : 178
Points : 178
salut,

Je n'ai pas mis le"|" pour le caractère de ton exemple mais pour sa fonction de renvoyer la sortie d'une commande vers l'entrée d'une autre commande...

Si j'ai bien compris dans ton fichier de sortie tu as les lignes contenant la chaine, mais si une ligne fait 5000 caractères, tu n'as que les 4096 premiers et les 904 autres à la ligne suivante. C'est ça ?

Un exemple pour afficher sur la même ligne les 5000 caractères:

Code :
echo ligne_de_5000_caracteres |sort /REC 5000 >fic.log
et la tu as tous tes caractères sur la même ligne...

C'est un exemple avec "echo" mais ça s'applique aux autres commandes...
ludo40190 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 14h45   #6
Altrensa
Nouveau Membre du Club
 
Étudiant
Inscription : juillet 2007
Messages : 113
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 113
Points : 39
Points : 39
Bonjour Ludo40190,
Bonjour à tous,

En fait, mon problème c'est que les 904 caractères que tu mentionnes sont carrément perdus. Ainsi, dans mon exemple :
[....]PAS|FINLIGNE1[...]
LIGNE2
Devient :
[....]PAS|LIGNE2

On a donc perdu "FINLIGNE1"... Cela semble être dû au fait que le string a une taille limite de 4096 caractères en batch.
Ainsi, le "echo ligne_5000_car" n'en affichera que 4096 et les 904 autres seront perdus...

De plus, et même si la solution pouvait fonctionner, il reste le problème du "5000" que je ne connais absolument pas à l'avance... Je ne vois donc pas comment utiliser ta proposition.

Merci, si c'est possible, de me préciser ta pensée afin que je puisse voir comment la mettre en oeuvre avec les contraintes évoquées.

Bien cordialement,

Altrensa
Altrensa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 15h14   #7
ludo40190
Membre actif
 
Homme Ludo
Administrateur systèmes et réseaux
Inscription : juin 2011
Messages : 141
Détails du profil
Informations personnelles :
Nom : Homme Ludo
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juin 2011
Messages : 141
Points : 178
Points : 178
5000 était la à titre d'exemple, mais tu peux spécifier juste le maximum, soit 65535.

Peux-tu mettre ton script en ligne, pour être sur de comprendre ce qui cloche?
Aussi tu travailles sur quel OS?
ludo40190 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 15h39   #8
Altrensa
Nouveau Membre du Club
 
Étudiant
Inscription : juillet 2007
Messages : 113
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 113
Points : 39
Points : 39
Ludo40190,

Je travaille sous Windows 7 et/ou Windows Server 2008 R2.
Mon script est le suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Echo Off

setlocal enabledelayedexpansion enableextensions

set nomFic=%1%
set cheminFic=%~dp1

Echo Determination des conditions et variables
set FILE=%nomFic%
Echo Fichier d'entree : %nomFic%
set SUPP1="CHAINE 1"
set SUPP2="CHAINE 2"
set FILE_IND=%cheminFic%IND_XXX_01.txt

Echo Creation des enveloppes vides ou vidage des fichiers
Copy nul %FILE_IND% >nul
Copy nul %FILE_IND%_TMP >nul

Echo Recherche de toutes les lignes que nous voulons
Find %SUPP1% %FILE% >>%FILE_IND%_TMP
Find %SUPP2% %FILE% >>%FILE_IND%_TMP

Echo Suppression des lignes en trop et ajout des points-virgules
for /F "skip=2 delims=" %%i in (%FILE_IND%_TMP) do echo %%i; >>%FILE_IND%
del %FILE_IND%_TMP
Le fichier %FILE_IND% contient bien tout ce qui est attendu, sauf pour les lignes ayant initialement plus de 4096 caractères.
Celles-ci sont, dans le fichier de sortie, coupées au 4096 caractères et la ligne suivante du fichier initiale, trouvée par le find, est écrite à partir du 4097ème caractère dans le fichier de sortie.

On perd donc les caractères à partir de la 4096ème position des lignes du fichier d'entrée. Sitôt cette barrière passée, on continue la copie par la ligne trouvée suivante, et ce, sans saut de ligne.

Si je n'ai pas été clair, n'hésitez pas à me dire ce que je dois préciser.

Bien cordialement,

Altrensa
Altrensa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 16h27   #9
ludo40190
Membre actif
 
Homme Ludo
Administrateur systèmes et réseaux
Inscription : juin 2011
Messages : 141
Détails du profil
Informations personnelles :
Nom : Homme Ludo
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juin 2011
Messages : 141
Points : 178
Points : 178
re,

la j'ai pas trop le temps de tester je verrai ce soir, mais déjà tu peux essayer ça:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Echo Off

setlocal enabledelayedexpansion enableextensions

set nomFic=%1%
set cheminFic=%~dp1

Echo Determination des conditions et variables
set FILE=%nomFic%
Echo Fichier d'entree : %nomFic%
set SUPP1="CHAINE 1"
set SUPP2="CHAINE 2"
set FILE_IND=%cheminFic%IND_XXX_01.txt

Echo Creation des enveloppes vides ou vidage des fichiers
Copy nul %FILE_IND% >nul
Copy nul %FILE_IND%_TMP >nul

Echo Recherche de toutes les lignes que nous voulons
Find %SUPP1% %FILE% | sort /REC 65535 >>%FILE_IND%_TMP
Find %SUPP2% %FILE% | sort /REC 65535 >>%FILE_IND%_TMP

Echo Suppression des lignes en trop et ajout des points-virgules
for /F "skip=2 delims=" %%i in (%FILE_IND%_TMP) do echo %%i | sort /REC 65535 ; >>%FILE_IND%
del %FILE_IND%_TMP
ludo40190 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 16h58   #10
Altrensa
Nouveau Membre du Club
 
Étudiant
Inscription : juillet 2007
Messages : 113
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 113
Points : 39
Points : 39
Bonjour à tous et excellente nouvelle année.

Je viens de tester la proposition que Ludo40190 m'avait faite avant les fêtes.
Elle ne fonctionne malheureusement pas.
En effet, en mettant le sort dans les find et le for, j'ai beaucoup d'erreurs "fichier spécifié introuvable" puis, en le mettant que dans le find, je me retrouve dans la même situation que précédemment...

Encore merci pour cet essai qui, je l'espère en appellera d'autres jusqu'à ce que le flag "résolu" puisse enfin claquer un vent, tout en haut de cette page.

Bien cordialement,

Altrensa
Altrensa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2013, 16h34   #11
Altrensa
Nouveau Membre du Club
 
Étudiant
Inscription : juillet 2007
Messages : 113
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2007
Messages : 113
Points : 39
Points : 39
* Claquer au vent bien sûr...
Altrensa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h38.


 
 
 
 
Partenaires

Hébergement Web