Question
Conserver la dernière occurence d'une liste de fic
- JP
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
il y a 11 ans 1 mois #18881
par JP
Conserver la dernière occurence d'une liste de fic a été créé par JP
Bonjour à tous,
tout nouveau dans le powershell
j'ai donc besoin de vos lumières pour construire un script qui me permettrait de :
- lister tous les fichiers d'un répertoire sachant qu'il s'agit d'applications versionnées.
Les fichiers ont donc un nom semblable mais avec le versionning en + (exemple : fic_V2.0.9.ipa)
- ne conserver que la dernière version de chaque application (sort lastwritetime ?) ... Et donc supprimer les anciennes.
En espérant avoir été assez exhaustif dans mon explication.
Merci pour votre aide
tout nouveau dans le powershell
j'ai donc besoin de vos lumières pour construire un script qui me permettrait de :
- lister tous les fichiers d'un répertoire sachant qu'il s'agit d'applications versionnées.
Les fichiers ont donc un nom semblable mais avec le versionning en + (exemple : fic_V2.0.9.ipa)
- ne conserver que la dernière version de chaque application (sort lastwritetime ?) ... Et donc supprimer les anciennes.
En espérant avoir été assez exhaustif dans mon explication.
Merci pour votre aide
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 11 ans 1 mois #18882
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Conserver la dernière occurence d'une liste de fic
Un
tutoriel
sur le sujet
Ensuite il faut analyser le numéro de version portée par le nom de fichier :
[code:1]
'test' > 'c:\temp\fic_V2.0.9.ipa'
$p=get-item 'c:\temp\fic_V2.0.9.ipa'
$p.Name
$Version=($p.BaseName -replace '^(.*)_V(\d*.\d*.\d*)','$2') -as [System.Version]
If ($version -ne $null)
{ $Version}
else
{Write-error \"Le fichier '$P' n'est pas versionné.\"}
[/code:1]
Je te laisse faire le reste.
Ensuite il faut analyser le numéro de version portée par le nom de fichier :
[code:1]
'test' > 'c:\temp\fic_V2.0.9.ipa'
$p=get-item 'c:\temp\fic_V2.0.9.ipa'
$p.Name
$Version=($p.BaseName -replace '^(.*)_V(\d*.\d*.\d*)','$2') -as [System.Version]
If ($version -ne $null)
{ $Version}
else
{Write-error \"Le fichier '$P' n'est pas versionné.\"}
[/code:1]
Je te laisse faire le reste.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- JP
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
il y a 11 ans 1 mois #18883
par JP
Réponse de JP sur le sujet Re:Conserver la dernière occurence d'une liste de fic
Merci pour la reponse. Je vais essayer d'y jeter un oeil rapidement.
Pour être plus clair voici un exemple de contenu du répertoire :
[code:1]
applis1_V2.0.1.ipa
applis1_V2.0.2.ipa
applis1_V2.0.3.ipa
applis12_V1.ipa
applis12_V1.1.ipa
applis12_V1.15.ipa
applis25_V1.0.ipa
applis25_V2.ipa
[/code:1]
Je veux donc conserver
[code:1]
applis1_V2.0.3.ipa
applis12_V1.15.ipa
applis25_V2.ipa
[/code:1]<br><br>Message édité par: jenko, à: 29/01/15 14:23
Pour être plus clair voici un exemple de contenu du répertoire :
[code:1]
applis1_V2.0.1.ipa
applis1_V2.0.2.ipa
applis1_V2.0.3.ipa
applis12_V1.ipa
applis12_V1.1.ipa
applis12_V1.15.ipa
applis25_V1.0.ipa
applis25_V2.ipa
[/code:1]
Je veux donc conserver
[code:1]
applis1_V2.0.3.ipa
applis12_V1.15.ipa
applis25_V2.ipa
[/code:1]<br><br>Message édité par: jenko, à: 29/01/15 14:23
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 11 ans 1 mois #18884
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Conserver la dernière occurence d'une liste de fic
jenko écrit:
M'est avis qu'ici il faut mettre tous les yeux dans le même panierJe vais essayer d'y jeter un oeil rapidement.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- JP
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
il y a 11 ans 1 mois #18928
par JP
Réponse de JP sur le sujet Re:Conserver la dernière occurence d'une liste de fic
Bon j'ai essayé de faire un bout de code seul.
Et je galère un peu
[code:1]
# creation de la liste des applis
$list_appli = New-Item -Path 'R:\TOTO\liste_appli.txt' -ItemType \"file\" -force
# on classe les objets par nom et par date de modif, puis on recupère le nom sans extension, on supprime 'liste_appli' du résultat.
gci 'R:\TOTO' | sort-object name, lastwritetime | % {$_.BaseName} | foreach {$_ -replace 'liste_appli', \"\"} | out-file $list_appli -encoding ASCII
# on purge list_appli du versionning et on supprime les doublons
gc $list_appli | %{$tableau = $_.split()[0..1] ; write-output \"$($tableau[0]) $($tableau[1])\"} | Select-Object –Unique | out-file 'R:\TOTO\list_appli_uniq.txt'
[/code:1]
J'ai donc maintenant une liste de mes applis, sans doublons et sans version.
A partir de ça je voulais faire une boucle du genre ... \"pour toutes les applis avec le nom semblable à ma liste, ne conserver que la dernière version, sinon supprimer les autres\"
Je sais pas si j'ai la bonne demarche ?
Désolé Laurent D. de ne pas avoir utiliser ton code mais pour le moment j'avance pas à pas
Ce qui est sure c'est qu'on doit pouvoir optimiser tout ça.
Un peu d'aide pour le foreach ?
Correction :
Le nom des applis est plutot de la forme
[code:1]
Appli test 1.0.1.ipa
Appli test 1.0.5.ipa
Appli titi 2.0.ipa
Appli titi 2.1.ipa
Appli toto 1.0.ipa
Appli toto 1.0.5.ipa
[/code:1]<br><br>Message édité par: jenko, à: 4/02/15 14:31
Et je galère un peu
[code:1]
# creation de la liste des applis
$list_appli = New-Item -Path 'R:\TOTO\liste_appli.txt' -ItemType \"file\" -force
# on classe les objets par nom et par date de modif, puis on recupère le nom sans extension, on supprime 'liste_appli' du résultat.
gci 'R:\TOTO' | sort-object name, lastwritetime | % {$_.BaseName} | foreach {$_ -replace 'liste_appli', \"\"} | out-file $list_appli -encoding ASCII
# on purge list_appli du versionning et on supprime les doublons
gc $list_appli | %{$tableau = $_.split()[0..1] ; write-output \"$($tableau[0]) $($tableau[1])\"} | Select-Object –Unique | out-file 'R:\TOTO\list_appli_uniq.txt'
[/code:1]
J'ai donc maintenant une liste de mes applis, sans doublons et sans version.
A partir de ça je voulais faire une boucle du genre ... \"pour toutes les applis avec le nom semblable à ma liste, ne conserver que la dernière version, sinon supprimer les autres\"
Je sais pas si j'ai la bonne demarche ?
Désolé Laurent D. de ne pas avoir utiliser ton code mais pour le moment j'avance pas à pas
Ce qui est sure c'est qu'on doit pouvoir optimiser tout ça.
Un peu d'aide pour le foreach ?
Correction :
Le nom des applis est plutot de la forme
[code:1]
Appli test 1.0.1.ipa
Appli test 1.0.5.ipa
Appli titi 2.0.ipa
Appli titi 2.1.ipa
Appli toto 1.0.ipa
Appli toto 1.0.5.ipa
[/code:1]<br><br>Message édité par: jenko, à: 4/02/15 14:31
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 11 ans 1 mois #18940
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Conserver la dernière occurence d'une liste de fic
jenko écrit:
jenko écrit:
jenko écrit:
LastWriteTime n'est pas le bon critère, de ce que j'ai compris c'est le numéro de version.
jenko écrit:
Avec un jeux de test c'est plus facile il me semble. A toi de compléter les cas, car je ne connais pas la norme.
Première étape rechercher les fichiers dont le numéro de version est le plus élevé, c'est à dire la dernière version :
[code:1]
#Lister tous les fichiers d'un répertoire sachant qu'il s'agit d'applications versionnées.
#Les fichiers ont donc un nom semblable mais avec le versionning en + (exemple : fic_V2.0.9.ipa)
#
#Ne conserver que la dernière version de chaque application (sort lastwritetime ?) ... Et donc supprimer les anciennes.
$Temp='C:\temp\TestVersion'
md $Temp
#Jeux de test basique
$Files=@(
'Appli test 1.0.1.ipa',
'Appli test 1.0.5.ipa',
'Appli titi 2.0.ipa',
'Appli titi 2.1.ipa',
'Appli toto 1.0.ipa',
'Appli toto 1.0.5.ipa',
'Appli Riri.ipa' # normé, mais sans N° de version
'Autre.ipa' #Normé ? Extension valide, mais sans N° de version
'Test.txt' #Comme le port-salut
'Test12.txt' #?
)
#création du jeux de test
$Files|
Foreach {
\"Test version $_\" > \"$Temp\$_\"
}
#recherche, parsing, groupement sur nom d'Application et enfin tri sur le n° de version s'il existe.
$LastVersionFiles=Dir \"$temp\*.ipa\"|
Foreach {
if ($_.BaseName -Match '^(?<ApplicationName>.*?)(?<Version>(\d*\.\d*\.\d*|\d*\.\d*))$')
{
$ApplicationName=$Matches.ApplicationName
$Version=$Matches.Version -as [System.Version]
}
else
{ $ApplicationName=$Version=$null }
Add-Member -InputObject $_ -MemberType Noteproperty -Name ApplicationName -Value $ApplicationName -Passthru|
Add-Member -MemberType Noteproperty -Name Version -Value $Version -Passthru
}|
Where {$_.ApplicationName -ne $null}| #todo warning/Erreur sur ceux $null ?
Group-Object ApplicationName|
Foreach {
($_.Group|Sort-Object Version -Descending)[0]
}
$LastVersionFiles
# Appli test 1.0.5.ipa
# Appli titi 2.1.ipa
# Appli toto 1.0.5.ipa
#Reste à faire : on détruit tout sauf ces fichiers
[/code:1]
CeciEt je galère un peu
jenko écrit:
expliquant cela.tout nouveau dans le powershell
jenko écrit:
Je n'ai pas compris ton code, ni pris le temps de le comprendre.Je sais pas si j'ai la bonne demarche ?
LastWriteTime n'est pas le bon critère, de ce que j'ai compris c'est le numéro de version.
jenko écrit:
Tu fais ce que tu veux.Désolé Laurent D. de ne pas avoir utiliser ton code mais pour le moment j'avance pas à pas
Avec un jeux de test c'est plus facile il me semble. A toi de compléter les cas, car je ne connais pas la norme.
Première étape rechercher les fichiers dont le numéro de version est le plus élevé, c'est à dire la dernière version :
[code:1]
#Lister tous les fichiers d'un répertoire sachant qu'il s'agit d'applications versionnées.
#Les fichiers ont donc un nom semblable mais avec le versionning en + (exemple : fic_V2.0.9.ipa)
#
#Ne conserver que la dernière version de chaque application (sort lastwritetime ?) ... Et donc supprimer les anciennes.
$Temp='C:\temp\TestVersion'
md $Temp
#Jeux de test basique
$Files=@(
'Appli test 1.0.1.ipa',
'Appli test 1.0.5.ipa',
'Appli titi 2.0.ipa',
'Appli titi 2.1.ipa',
'Appli toto 1.0.ipa',
'Appli toto 1.0.5.ipa',
'Appli Riri.ipa' # normé, mais sans N° de version
'Autre.ipa' #Normé ? Extension valide, mais sans N° de version
'Test.txt' #Comme le port-salut
'Test12.txt' #?
)
#création du jeux de test
$Files|
Foreach {
\"Test version $_\" > \"$Temp\$_\"
}
#recherche, parsing, groupement sur nom d'Application et enfin tri sur le n° de version s'il existe.
$LastVersionFiles=Dir \"$temp\*.ipa\"|
Foreach {
if ($_.BaseName -Match '^(?<ApplicationName>.*?)(?<Version>(\d*\.\d*\.\d*|\d*\.\d*))$')
{
$ApplicationName=$Matches.ApplicationName
$Version=$Matches.Version -as [System.Version]
}
else
{ $ApplicationName=$Version=$null }
Add-Member -InputObject $_ -MemberType Noteproperty -Name ApplicationName -Value $ApplicationName -Passthru|
Add-Member -MemberType Noteproperty -Name Version -Value $Version -Passthru
}|
Where {$_.ApplicationName -ne $null}| #todo warning/Erreur sur ceux $null ?
Group-Object ApplicationName|
Foreach {
($_.Group|Sort-Object Version -Descending)[0]
}
$LastVersionFiles
# Appli test 1.0.5.ipa
# Appli titi 2.1.ipa
# Appli toto 1.0.5.ipa
#Reste à faire : on détruit tout sauf ces fichiers
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.049 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Conserver la dernière occurence d'une liste de fic