Résolu Avis sur un script qui doit corriger des noms de fichiers avec pleins replace

Plus d'informations
il y a 8 mois 4 semaines - il y a 8 mois 2 semaines #34103 par Gabriel
[edit j'ai eu une réponse satisfaisante à ma question ,mais cela a ouvert un sujet sur le mode débogage   très intéressante]
bonjour
j'aimerais avoir votre avis sur un script de renommage de photos qui corrige pleins d'erreur de type TYPO (au moment de la saisie on oublie les accents ou on est sujet à dyslexique)

pour le moment je passe le nom du fichier dans une moulinette comme celle-ci

    $FichierATraiter = $FichierATraiter -replace "{|\(|\[\[","["
    $FichierATraiter = $FichierATraiter -replace "}|\)|\}\}","]"
    $FichierATraiter = $FichierATraiter -replace "\s\[(\d+)\]|\((\d+)\)","_`$1"
    $FichierATraiter = $FichierATraiter -replace "\[(\d+)\]","_`$1"
    $FichierATraiter = $FichierATraiter -replace "__","_"
    $FichierATraiter = $FichierATraiter -replace "--|_-_","-"
    $FichierATraiter = $FichierATraiter -replace "mar[eèêë]e","marée"
    $FichierATraiter = $FichierATraiter -replace "clotihlde|clohtilde","Clothilde"
    $FichierATraiter = $FichierATraiter -replace "Vintage","vintage"
    $FichierATraiter = $FichierATraiter -replace "a_paris","à_paris"


bon ca marche mais ca veut dire une nouvelle ligne pour chaque correction, je voulais savoir si il y avait d'autres idées?

je pourrais mettre les paire de string dans un fichier les charger au lancement du script et faire un foreach, mais y a t il une meilleure approche (la liste des fichiers grandi a mesure que je scanne et que je trie)

cordialement
Gabriel



 
Dernière édition: il y a 8 mois 2 semaines par Gabriel.

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

Plus d'informations
il y a 8 mois 4 semaines #34106 par Alastor
Bonjour,

Effectivement, tu peux dissocier les règles d'un coté, et leur application de l'autre, c'est plus facile à faire évoluer.
Comme par exemple, avec un array d'array :
$Rules = @(
   @("{|\(|\[\[","[","qui fait un truc"),
   @("}|\)|\}\}","]","qui fait un autre truc")
)
foreach ($CurrentRule in $Rules) {
   write-verbose "Rule applied : $($CurrentRule[2])"
   $FichierATraiter = $FichierATraiter -replace $CurrentRule[0], $CurrentRule[1] 
}

Ou quelque chose dans le genre (j'ai pas de powershell sous la main là de suite..
C'est plus élégant avec les objets ou des hashtables, mais ça marche, et pour pouvoir suivre ce qui se passe, mettre un "commentaire" intégré à la règle peut-être sympa, ici utilisé avec le write-verbose.

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

Plus d'informations
il y a 8 mois 3 semaines #34110 par Gabriel
ahh cool en effet

je vais adapter le script en conséquence.

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

Plus d'informations
il y a 8 mois 3 semaines - il y a 8 mois 3 semaines #34111 par Christophe MELIN
Bonjour,

Je te soumets un bout de code que j'utilise régulièrement dans mes batchs (je suis admin système avec des casquettes Exchange et Sharepoint). Il y a une fonction qui n'est pas forcément des plus propres mais qui fait le boulot attendu.
Set-PSDebug -Off
set-PSdebug -strict        # erreur si utilisation d'une variable pas encore initialisée

#-- initialisation des variables générales --
$start = Get-Date
$startwatch = [system.diagnostics.stopwatch]::StartNew()

$fullscript    = $MyInvocation.MyCommand.path
$fullscript    = [System.IO.Path]::GetFullPath($fullscript)
$scriptdir    = [System.IO.Path]::GetDirectoryName($fullscript)
$scriptname    = [System.IO.Path]::GetFileNameWithoutExtension($fullscript)
$scriptext    = [System.IO.Path]::GetExtension($fullscript)

$computername    = [System.Net.Dns]::GetHostName()

#-------------------------------------------------------------------------------
# début des fonctions standards
#-------------------------------------------------------------------------------
function ReplaceAllStrings()
{
    param (
        [string] $SearchInStr,
        $arrStrings
    )

    $outstr = $SearchInStr
    if ( $arrStrings.GetType().IsArray ) {
        foreach ( $item in $arrStrings ) {
            if ( $item.GetType().IsArray ) {
                if( $item.count -ge 2 ) {
                    $outstr = $outstr.replace( $item[0], $item[1] )
                }
            }
        }
    }
    return $outstr
}

#-------------------------------------------------------------------------------
# début des traitements
#-------------------------------------------------------------------------------
$datestr = $start.ToString( 'yyyyMMdd' )

$arrStrings = @(
    @( '#datestr#',      $datestr ),
    @( '#computername#', $computername ),
    @( '#scriptdir#',    $scriptdir ),
    @( '#scriptname#',   $scriptname )
)

$inputstr = '
<?xml version="1.0" encoding="ISO-8859-1"?>
<Configuration>
  <log>
    <path>#scriptdir#\log</path>
    <filename>#scriptname#-#datestr#.log</filename>
    <computer>#computername#</computer>
  </log>
</Configuration>
'
$outstr = ReplaceAllStrings -SearchInStr $inputstr -arrStrings $arrStrings

write-host "imput string :$inputstr"
write-host "output string :$outstr"
Cela me permet d'avoir le même script et le même fichier de config (quand je mets le contenu de la chaine $inputstr dans un fichier de config .xml) quel que soit le serveur où j'exécute le batch.
 
Dernière édition: il y a 8 mois 3 semaines par Christophe MELIN.

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

Plus d'informations
il y a 8 mois 3 semaines - il y a 8 mois 3 semaines #34113 par Alastor
Ah ! Je ne connaissais pas Set-PSDebug !

Je sais que je dois progresser justement sur le debug !
Merci !

Par contre, pourquoi l'intégrer dans un script ?
Est ce que ça ne devrait pas rester de la responsabilité de l"'environnement d'exécution" ?
Dis autrement, a la main de celui qui lance le script ?
 
Dernière édition: il y a 8 mois 3 semaines par Alastor.

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

Plus d'informations
il y a 8 mois 3 semaines #34117 par Christophe MELIN
Je travaille dans une équipe de production qui gère plusieurs centaines de serveurs Windows. En principe, ce n'est pas en production qu'il faut faire du debug. Cela doit avoir été fait avant et si on rencontre un problème en prod, on repasse hors prod avec gestion manuelle des paramètres d'exécution.

Donc pour éviter des actions inopinées en production, on ajoute cette option dans les scripts qui sont lancés par tâche planifiée ou par l'ordonnanceur centralisé.
Les utilisateur(s) suivant ont remercié: Alastor

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

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