Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1496 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7  8
Auteur Sujet :

Powershell[Topic Unik]

n°2420216
arnuche
Posté le 21-06-2022 à 12:25:33  profilanswer
 

Reprise du message précédent :
Merci !
Je crois que tu as bien compris  :) , le but est d'aller chercher la date dans le nom et de la mettre derrière le premier mot.
 
Mais là c'est moi qui suis un peu perdu, je ne connais pas ce genre de scripts, les miens sont en général sur une seule ligne (voire 2 avec le regex).
Concrètement je fais comment pour en faire un batch (donc désigner un dossier comme dans mon exemple) ?
Et faut-il passer par une liste d'exemples comme au début de ton script ?
 

Citation :

Tu utilises une regex comme chaîne de remplacement ?


Là c'était un exemple mais l'idée vient de là ;
https://forum.hardware.fr/hfr/Progr [...] m#t2419185

Message cité 1 fois
Message édité par arnuche le 21-06-2022 à 12:28:43
mood
Publicité
Posté le 21-06-2022 à 12:25:33  profilanswer
 

n°2420232
rorosk
Posté le 21-06-2022 à 14:02:33  profilanswer
 

La façon d’exécuter le script dépend un peu de si tu comptes le réutiliser ou si c'est du "one shot" (il ne te servira qu'une fois). Mais si tu sais exécuter deux lignes de codes, c'est la même chose.
Dans la console Powershell, si tu tapes par exemple "gci | % { " puis entrée, tu peux continuer à écrire les lignes suivantes jusqu’à fermeture de l'accolade (l'invite de la console devient ">>", le code ne sera exécuté qu'après par exemple avoir tapé "$_.FullName }" puis enter.
 
Donc, avec un exemple complet dans le cas où c'est du "one shot".
On créé des fichiers vides pour tester dans "D:\_test" (copier-coller dans la console PowerShell les lignes suivantes) :

"D:\_test\voiture bleue 18 03 25 18h42 salut.txt",
"D:\_test\voiture verte rouge 18 03 25 18h42 jaune 19 04 26 19h53 salut.txt",
"D:\_test\subfolder\voiture orange 18 03 25 18h42.txt",
"D:\_test\subfolder\voiture verte sans date.txt" | % { New-Item $_ -Force }


 
Puis on lance le renommage (pareil, il suffit de copier-coller dans la console, ou taper ligne par ligne) :

$pattern = [regex]" \d{2} \d{2} \d{2} \d{2}h\d{2}"
gci "D:\_test" -File -Recurse | ? { $_.Name -match $pattern} | % {
    $newName = $pattern.Replace($_.Name, "", 1)
    $newName = $newName.Insert($newName.IndexOf(" " ), $matches[0])
    Rename-Item $_.FullName -NewName $newName -Whatif
}


A noter :
* ? = Where-Object
* % = ForEach-Object
* -Whatif : je te recommande d'utiliser ce commutateur, la plupart des cmdlets natives le supporte, cela permet "d'émuler" la commande, au lieu d'être exécutée, le résultat théorique est affiché dans la console. Cela permet dans notre cas de vérifier l'éxécutuon sans toucher aux fichiers, et une fois sûr, on ré-exécute la même chose sans le -whatif.
 
Résultat :

WhatIf : Opération « Renommer le fichier » en cours sur la cible « Élément : D:\_test\voiture bleue 18 03 25 18h42 salut.txt Destination : D:\_test\voiture 18 03 25 18h42 bleue salut.txt ».
WhatIf : Opération « Renommer le fichier » en cours sur la cible « Élément : D:\_test\voiture verte rouge 18 03 25 18h42 jaune 19 04 26 19h53 salut.txt Destination : D:\_test\voiture 18 03 25 18h42 verte rouge jaune 19 04 26 19h53 salut.txt ».
WhatIf : Opération « Renommer le fichier » en cours sur la cible « Élément : D:\_test\subfolder\voiture orange 18 03 25 18h42.txt Destination : D:\_test\subfolder\voiture 18 03 25 18h42 orange.txt ».


 

n°2420237
rorosk
Posté le 21-06-2022 à 14:07:57  profilanswer
 

arnuche a écrit :

Concrètement je fais comment pour en faire un batch (donc désigner un dossier comme dans mon exemple) ?

Faire un batch, tu veux dire faire un script réutilisable dans lequel le chemin d'accès du dossier serait passé en paramètre ?
 

n°2420242
arnuche
Posté le 21-06-2022 à 14:28:50  profilanswer
 

Merci pour les explications, mais je ne comprends pas encore tout, c'est nouveau pour moi.
 
Je suppose que je dois remplacer gci par -Path, enlever -File et -Whatif, et pour -recurse je ne sais pas, jamais utilisé.
 

rorosk a écrit :

Faire un batch, tu veux dire faire un script réutilisable dans lequel le chemin d'accès du dossier serait passé en paramètre ?


Ben pour l'appliquer à tous les fichiers d'un dossier (ou à la limite à un type de fichiers, ça je sais faire avec par exemple  -Filter *.txt), donc avec -Path, histoire de tester ça sur un vrai fichier.
 
J'ai un dossier test dans lequel je mets des copies de petits fichiers et quand ça marche je l'applique au dossier où se trouvent tous mes fichiers à renommer.
Le but de ce genre de scripts est bien sûr d'en faire un batch puisque si je n'avais qu'un fichier à renommer, je le ferais manuellement.
 
Quand je dis batch, je ne fais pas allusion à un fichier .bat mais simplement une commande comme celle que j'ai postée qui indique un dossier auquel appliquer la commande et donc à tous les fichiers qu'il contient.


Message édité par arnuche le 21-06-2022 à 14:31:00
n°2420245
rorosk
Posté le 21-06-2022 à 14:52:27  profilanswer
 

Non, dans l'exemple donné il parcours déjà tous les fichier d'un dossier de manière récursive : gci est un alias de Get-ChildItem.
C'est vrai que je n'avais pas mis explicitement le commutateur "-Path", car en PowerShell certains paramètres peuvent être positionnels, c'est à dire que "gci -path D:\_test" est exactement la même chose que "gci D:\_test".
 
Dans un premier temps, dans les lignes suivantes, la seule chose à remplacer est "D:\_test" par le chemin d'accès de ton répertoire.


$folderPath = "D:\_test"
$pattern = [regex]" \d{2} \d{2} \d{2} \d{2}h\d{2}"
gci -Path $folderPath -File -Recurse | ? { $_.Name -match $pattern} | % {
    $newName = $pattern.Replace($_.Name, "", 1)
    $newName = $newName.Insert($newName.IndexOf(" " ), $matches[0])
    Rename-Item $_.FullName -NewName $newName -Whatif
}


Si tu copie-colle ces lignes dans ta console PowerShell (c'est sans risque grâce au Whatif), il devrait t'afficher les résultats.
 
Ce qu'il se passe :
1. gci... : liste de manière récursive (examine donc aussi les sous-dossiers) tous les fichier dans le répertoire $path
2. ? { ... : Filtre les fichiers dont le nom matche l'expression régulière (ne conserve que les fichiers dont le nom contient une date).
3. % { ... : Pour chaque fichier, exécute les lignes de code dans les accolades.

n°2420247
arnuche
Posté le 21-06-2022 à 15:49:07  profilanswer
 

Merci, j'y vois nettement plus clair  :jap:  
Ça marche nickel, encore plus simple que ce que j'avais imaginé puisque ça se fait en une étape (déplacement au lieu de dédoublement) :)  
 
2 petites questions de noob ;
-quel est l'intérêt de la 1ère ligne ($folderPath = ...) au lieu de mettre directement l'adresse à droite de gci ?
-on peut tout mettre en une ligne (en tout cas à partir de gci) ou il y a une raison particulière d'écrire tout ça en plusieurs lignes, avec la dernière accolade qui occupe une ligne à elle seule ?

n°2420249
rorosk
Posté le 21-06-2022 à 16:25:38  profilanswer
 

* L'intérêt était juste de mettre en évidence la valeur à changer en le mettant dans la première ligne.
 
* On peut tout mettre sur une ligne, en utilisant ; comme séparateur pour les lignes à l’intérieur de l'accolade. En simplifiant encore plus :

gci "D:\_test" -File -Recurse | ? { $_.Name -match $pattern} | % { $pattern = [regex]" \d{2} \d{2} \d{2} \d{2}h\d{2}" }{ $nn = $pattern.Replace($_.Name, "", 1); Rename-Item $_.FullName ($nn.Insert($nn.IndexOf(" " ), $matches[0])) -Whatif }

Bon, c'est plus très lisible (un peu le défaut de PowerShell). Personnellement, je préfère privilégier la lisibilité, quitte à être moins intelligent. On peut faire beaucoup de chose avec les regex en une seule ligne, mais ça peut devenir inmaintenable.
 
   * Avec ForEach-Object la syntaxe % { ... } { ... } permet de déclarer un bloc BEGIN (ça équivaut à faire  ForEach-Object -Begin { ... } -Process { ... } ), ce bloc n'est exécuté qu'une seule fois en début de pipeline, ce qui permet de déclarer le pattern dans la même ligne.


Message édité par rorosk le 21-06-2022 à 16:29:52
n°2420264
arnuche
Posté le 21-06-2022 à 19:04:10  profilanswer
 

Merci, intéressant  :jap:  
En fait je vois qu'il y a souvent (voire toujours) plusieurs moyens d'obtenir ce qu'on veut avec PS.


Message édité par arnuche le 21-06-2022 à 19:04:52
n°2420451
arnuche
Posté le 23-06-2022 à 17:03:16  profilanswer
 

@ rorosk : je viens d'avoir une idée, comment modifier un pattern en plus de le déplacer en un seul script ?
Par exemple pour remplacer des tirets par des espaces, changer l'ordre des mois et années ou supprimer l'heure après la date.
 
En 2 scripts je vois : d'abord modifier la date avec juste la fonction -replace, sans regex ni $pattern.Replace, puis avec ton script pour déplacer le nouveau pattern.
 
Je suppose qu'il doit y avoir moyen de modifier ton script mais je ne vois pas bien comment.

n°2420484
rorosk
Posté le 23-06-2022 à 22:59:26  profilanswer
 

Tu peux enchaîner via le pipeline ? Rename-Item supporte -passthru (souvent les cmdlets utilisent ce paramètre pour renvoyer un élément dans le pipeline).
Attention, on ne peut pas combiner -passthru et -whatif.
 

$pattern = [regex]" \d{2} \d{2} \d{2} \d{2}h\d{2}"
gci "D:\_test" -File -Recurse | ? { $_.Name -match $pattern} | % {
    $newName = $pattern.Replace($_.Name, "", 1)
    $newName = $newName.Insert($newName.IndexOf(" " ), $matches[0])
    Rename-Item $_.FullName -NewName $newName -Passthru
} | % { Rename-Item $_ -NewName ($_.Name -Replace "-", " " ) }


Message édité par rorosk le 23-06-2022 à 22:59:45
mood
Publicité
Posté le 23-06-2022 à 22:59:26  profilanswer
 

n°2420534
arnuche
Posté le 24-06-2022 à 15:53:22  profilanswer
 

Merci, j'ai tenté mais il n'a pas tenu compte de la dernière ligne, j'ai essayé exactement ça ;

Code :
  1. $pattern = [regex]" \d{2}-\d{2}-\d{2} \d{2}h\d{2}"
  2. gci "K:\test" -File -Recurse | ? { $_.Name -match $pattern} | % {
  3.     $newName = $pattern.Replace($_.Name, "", 1)
  4.     $newName = $newName.Insert($newName.IndexOf(" " ), $matches[0])
  5.     Rename-Item $_.FullName -NewName $newName -Passthru
  6. } | % { Rename-Item $_ -NewName ($_.Name -Replace " \d{2}-\d{2}-\d{2} \d{2}h\d{2}", " \d{2} \d{2} \d{2} \d{2}h\d{2}" ) }


J'ai donc rajouté des tirets dans ma date et elle a bien été déplacée mais les tirets sont toujours là. :??:

n°2420642
doum
Mentalita nissarda
Posté le 26-06-2022 à 19:38:52  profilanswer
 

si tu scripts, je te conseille fortement d'eviter l'utilisation d'alias dans des scripts, c'est d'ailleurs déconseillé dans les bonnes pratiques
 
les alias c'est bien quand tu tapes du powershell a la main, mais pour les scripts c'est déconseillé
 
https://devblogs.microsoft.com/scri [...] l-aliases/

n°2420645
gamer-fou
AHHHHHH§§§!!!
Posté le 26-06-2022 à 20:50:03  profilanswer
 

Et si au passage les gens pouvaient arrêter de faire des fonctions pour 4 lignes de code qui ne sont appelées qu'une fois on aurait une bonne base pour du code lisible :o


---------------
Music is the most high!
n°2420646
Je@nb
Kindly give dime
Posté le 26-06-2022 à 20:59:52  profilanswer
 

Faudrait que je vous retrouve un script d'un presta d'un de mes clients, ça m'a fait vraiment pitié.
Fonction main, des tests inutiles dans tous les sens

Message cité 1 fois
Message édité par Je@nb le 26-06-2022 à 21:02:11
n°2420648
arnuche
Posté le 26-06-2022 à 21:31:48  profilanswer
 

doum a écrit :

si tu scripts, je te conseille fortement d'eviter l'utilisation d'alias dans des scripts, c'est d'ailleurs déconseillé dans les bonnes pratiques
 
les alias c'est bien quand tu tapes du powershell a la main, mais pour les scripts c'est déconseillé
 
https://devblogs.microsoft.com/scri [...] l-aliases/


Dans mon cas ça n'a rien changé, j'ai remplacé gci par Get-Childitem mais le Passthru pose problème, voilà le message d'erreur avec cette commande ;

Code :
  1. $pattern = [regex]" \d{2}-\d{2}-\d{2} \d{2}h\d{2}"
  2. Get-Childitem -Filter *.txt "K:\test" | ? { $_.Name -match $pattern} | % {
  3.     $newName = $pattern.Replace($_.Name, "", 1)
  4.     $newName = $newName.Insert($newName.IndexOf(" " ), $matches[0])
  5.     Rename-Item $_.FullName -NewName $newName -Passthru
  6. } | % { Rename-Item $_ -NewName ($_.Name -Replace " \d{2}-\d{2}-\d{2} \d{2}h\d{2}", " \d{2} \d{2} \d{2} \d{2}h\d{2}" ) }


 

Code :
  1. Rename-Item : Impossible de renommer la cible spécifiée, car elle représente un chemin d’accès ou un nom d’appareil.
  2. Au caractère Ligne:5 : 9
  3. + } | % { Rename-Item $_ -NewName ($_.Name -Replace " \d{2}-\d{2}-\d{2} ...
  4. +         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5.     + CategoryInfo          : InvalidArgument : (:) [Rename-Item], PSArgumentException
  6.     + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.RenameItemCommand


Problème de syntaxe ? :??:  
 
J'ai aussi tenté de remplacer dans la dernière ligne Rename-Item $_ par $_ | Rename-Item mais j'ai le même message d'erreur.


Message édité par arnuche le 26-06-2022 à 21:33:57
n°2420662
gamer-fou
AHHHHHH§§§!!!
Posté le 26-06-2022 à 23:38:16  profilanswer
 

Je@nb a écrit :

Faudrait que je vous retrouve un script d'un presta d'un de mes clients, ça m'a fait vraiment pitié.
Fonction main, des tests inutiles dans tous les sens


Le combo parfait, une fonction main qui contient uniquement des appels vers d'autres fonctions [:prozac]
Qui sont ces gens, quels sont leurs réseaux?


Message édité par gamer-fou le 26-06-2022 à 23:39:13

---------------
Music is the most high!
n°2420691
Je@nb
Kindly give dime
Posté le 27-06-2022 à 11:16:45  profilanswer
 

J'ai retrouvé son GitHub :D  
Exemple de script à la con :D  
https://github.com/ropy1971/azure-p [...] Offers.ps1

n°2420706
gamer-fou
AHHHHHH§§§!!!
Posté le 27-06-2022 à 14:00:46  profilanswer
 

Chaque fonction qui appelle la suivante [:prozac]
Et nique les try/catch pour faire les tests aussi, évidemment :jap:


Message édité par gamer-fou le 27-06-2022 à 14:03:07

---------------
Music is the most high!
n°2421478
Amaniak
Schnitzel, Prima!
Posté le 07-07-2022 à 21:12:01  profilanswer
 

Hello!
 
Dites je cherche à comparer des checksum de dossiers raw data avant et après migration pour vérifier leur integrité.
 
Pour ce faire j'ai trouvé ce petit script powershell interessant:
 

Code :
  1. $erroractionpreference = "SilentlyContinue"
  2. try{stop-transcript|out-null}
  3. catch [System.InvalidOperationException]{}
  4. $oPath = "$env:SystemRoot\Temp"
  5. $rPath = "$oPath\CheckSUM_Result.csv"
  6. $rHPath = "$oPath\CheckSUM_Result.html"
  7. $tLogPath = "$oPath\File_CheckSUM_Transcript_Log.log"
  8. $isMatch = "false"
  9. $isFile = "false"
  10. $IsRecurse = ""
  11. $hashCheck = ""
  12. $recurValue = ""
  13. Start-Transcript -path $tLogPath -NoClobber -Append -Force
  14. if(Test-Path $rPath){Remove-item $rPath}
  15. if(Test-Path $rHPath){Remove-item $rHPath}
  16. # Defining CSS Style for HTML Report
  17. $Header = @"
  18. <style>
  19. TABLE {border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}
  20. TH {border-width: 1px;padding: 3px;border-style: solid;border-color: black;background-color: #6495ED;}
  21. TD {border-width: 1px;padding: 3px;border-style: solid;border-color: black;}
  22. P {color:Green;font-weight:bold}
  23. H4{color:Blue;font-weight:bold}
  24. </style>
  25. "@
  26. "First Path,First Hash,Second Path,Second Hash, Compare Result" | Out-File $rPath -Append -Encoding ASCII
  27. # Input First File or Folder
  28. do{
  29. $firstPath = Read-Host -Prompt 'Enter First File or Folder'
  30. if(!(Test-Path $firstPath)){write-host "Invalid Path $firstPath.Provide correct  Path" -foregroundcolor red;$firstPath = ""}
  31. }while(([String]::IsNullOrEmpty($firstPath)))
  32. # Input Second File or Folder
  33. do{
  34. $secondPath = Read-Host -Prompt 'Enter Second File or Folder'
  35. if(!(Test-Path $secondPath)){write-host "Invalid Path $secondPath.Provide correct Path" -foregroundcolor red;$secondPath = ""}
  36. }while(([String]::IsNullOrEmpty($secondPath)))
  37. # Input Scan type choice
  38. do{
  39. $IsRecurse = Read-Host -Prompt "Enter 'R' for Recurse or any other key for No-Recurse"
  40. }while(([String]::IsNullOrEmpty($IsRecurse)))
  41. write-host "You have entered First Path : $firstPath `nYou have entered First Path : $secondPath" -foregroundcolor green
  42. # Check if entered data are as per the standard requirement of scan
  43. if(((Get-Item $firstPath) -is [System.IO.DirectoryInfo]) -and ((Get-Item $secondPath) -is [System.IO.DirectoryInfo])){
  44. write-host "You have entered Directory Path, All files and folders inside the Directory will be scanned and compared" -foregroundcolor green
  45. $isMatch = "true"
  46. $isFile = "false"
  47. }
  48. elseif(((Get-Item $firstPath) -is [System.IO.FileInfo]) -and ((Get-Item $secondPath) -is [System.IO.FileInfo])){
  49. write-host "You have entered a File Path,Only entered File will be scanned and compared" -foregroundcolor green
  50. $isMatch = "true"
  51. $isFile = "true"
  52. }
  53. else{write-host "Cannot compare if Object type does not match!Please provide correct information!" -foregroundcolor red;Exit}
  54. # Start scanning here
  55. if($isMatch){
  56. # Scan one file when enter file scans
  57. if($isFile -eq "true" ){
  58.  $fHash = $sHash = $hashCheck = ""
  59.  write-host "scanning First File : $firstPath" -foregroundcolor green
  60.  $fScan = Get-FileHash $firstPath -Algorithm MD5
  61.  write-host "scanning Second File : $secondPath" -foregroundcolor green
  62.  $sScan = Get-FileHash $secondPath -Algorithm MD5
  63.  $fHash = $fScan.Hash
  64.  $sHash = $sScan.Hash
  65.  if($fHash -eq $sHash){$hashCheck = "MATCHED"}else{$hashCheck = "NOT MATCHED"}
  66.  write-host "displaying Formatted result" -foregroundcolor green
  67.  "$firstPath,$fHash,$secondPath,$sHash,$hashCheck" | Out-File $rPath -Append -Encoding ASCII
  68. # Printing HTML output on-screen
  69.  get-content $rPath | ConvertFrom-CSV | ConvertTo-Html -Title "MD5 CheckSUM Comparison Report" -Head $Header -body "<P>First Path : $firstPath</P><P>Second Path : $secondPath</P> " -pre "<P>MD5 CheckSUM Comparison Report</P>" > $rHPath
  70.  start $rHPath
  71. }
  72. else{
  73. # Scans Directories and Subdirectories here
  74.   if($IsRecurse.ToUpper() -eq "R" ){$recurValue = "Recursive Scan";$allScan = Get-ChildItem -Path $firstPath -recurse}
  75.   else{$recurValue = "Non-Recursive Scan";$allScan = Get-ChildItem -Path $firstPath}
  76.    $allScan |  ForEach-Object {
  77.    # Generate file name in destination folder
  78.    $DstFileName = $FirstFile = $FirstFileHash = $SecondFile = $SecondFileHash = $hashCheck = ""
  79.     $DstFileName = Resolve-Path -Path (Join-Path $secondPath $_.FullName.Substring(($firstPath.Length)+1))
  80.     #$DstFileName = Resolve-Path -Path (Join-Path -Path $secondPath -ChildPath (Split-Path -Path $_.FullName -Leaf))
  81.     $FirstFile = $_.FullName
  82.     if(!$_.PsIsContainer){
  83.      $FirstFileHash = (Get-FileHash -Path $_.FullName -Algorithm MD5).Hash
  84.      $SecondFile = $DstFileName
  85.      $SecondFileHash = (Get-FileHash -Path $DstFileName -Algorithm MD5).Hash
  86.      if($FirstFileHash -eq $SecondFileHash){$hashCheck = "MATCHED"}
  87.      else{$hashCheck = "NOT MATCHED"}
  88.     "$FirstFile,$FirstFileHash,$SecondFile,$SecondFileHash,$hashCheck" | Out-File $rPath -Append -Encoding ASCII
  89.    }
  90.   }
  91. # Printing HTML output on-screen
  92. get-content $rPath | ConvertFrom-CSV | ConvertTo-Html -Title "MD5 CheckSUM Comparison Report" -Head $Header -body "<P>First Path : $firstPath</P><P>Second Path : $secondPath</P> <P>Scan Type : $recurValue</P>" -pre "<P>MD5 CheckSUM Comparison Report</P>" > $rHPath
  93. start $rHPath
  94. }
  95. }


 
https://arindamhazra.com/compare-md [...] een-files/
 
Cependant ça marche qu'à moitié, ça sort bien les hashs des fichiers "before", mais pas ceux des fichiers "after" la comparaison ne marche pas du coup...
 
Ca me sort ça:
 
https://rehost.diberie.com/Picture/Get/f/78933
 
Une idée de ce qu'il faudrait corriger à ce script pour que ça marche?  [:transparency]  
 
PS: je suis nul en code moi...  :o
 
Edit: corrigé


Message édité par Amaniak le 07-07-2022 à 23:38:32

---------------
drugs designer
n°2421480
Je@nb
Kindly give dime
Posté le 07-07-2022 à 21:30:18  profilanswer
 

Ligne 79 met second au lieu de secod  :D

n°2421484
Amaniak
Schnitzel, Prima!
Posté le 07-07-2022 à 23:45:43  profilanswer
 

Je@nb a écrit :

Ligne 79 met second au lieu de secod  :D


Merci! Ca marche!  [:roi]
 
T'as l'oeil!  :D


---------------
drugs designer
n°2421490
Amaniak
Schnitzel, Prima!
Posté le 08-07-2022 à 09:34:27  profilanswer
 

Sinon petite question de noob, ça veut dire quoi "recursif" "non-recursif"?


---------------
drugs designer
n°2421491
gamer-fou
AHHHHHH§§§!!!
Posté le 08-07-2022 à 09:38:27  profilanswer
 

Amaniak a écrit :

Sinon petite question de noob, ça veut dire quoi "recursif" "non-recursif"?


Citation :

Qui peut être répété un nombre indéfini de fois par l'application de la même règle


En gros ça veut dire "continue tant que tu trouves quelque chose à traiter"
Ici c'est pour récupérer tous les fichiers dans ton dossier cible, mais également dans les sous-dossiers, leurs sous-dossiers etc


Message édité par gamer-fou le 08-07-2022 à 09:39:01

---------------
Music is the most high!
n°2421496
Amaniak
Schnitzel, Prima!
Posté le 08-07-2022 à 11:03:34  profilanswer
 

Ok je vois, merci.  :jap:


---------------
drugs designer
n°2421608
arnuche
Posté le 10-07-2022 à 12:56:07  profilanswer
 

Bonjour,
 
je bloque sur un cas particulier, y a-t-il moyen d'inclure l'extension dans un pattern ?
 
Je voudrais renommer des fichiers qui se terminent par un mot suivi d'un espace et un chiffre, mais uniquement s'il n'y a rien d'autre derrière ce chiffre avant l'extension, exemple ;
ma chemise 3.jpg
doit devenir
ma chemise.jpg
MAIS
ma chemise 3 couleurs.jpg
doit rester tel quel et ne pas devenir
ma chemise couleurs.jpg
 
Je pensais à des scripts de ce genre mais ça ne marche pas (et j'ai testé plusieurs variantes avec ou sans accolades et parenthèses) ;
[regex]$pattern = ' chemise (\d{1})'+'$_.Extension'
Get-Childitem -Filter *.jpg -Path "K:\test" | ForEach-Object { $_ | Rename-Item -NewName ($pattern.replace($_ , ' chemise' + '$_.Extension', 1))}
 
ou sans regex ;
Get-Childitem -Filter *.jpg -Path "K:\test" | ForEach-Object { $_ | Rename-Item -NewName {$_.name -replace ' chemise (\d{1})' + '$_.Extension', ' chemise' + '$_.Extension'}}
 
C'est juste un problème de syntaxe ou ce n'est pas possible de cette manière ?


Message édité par arnuche le 10-07-2022 à 12:58:45
n°2421940
arnuche
Posté le 13-07-2022 à 12:09:46  profilanswer
 

Z'êtes tous en vacances ou quoi ?  :o  :p  
 
J'ai trouvé une solution mais qui implique d'indiquer l'extension dans le nom ;
Get-Childitem -Path "K:\test" | ForEach-Object { $_ | Rename-Item -NewName {$_.Fullname -replace ' chemise (\d{1}).jpg', ' chemise.jpg'}}
 
L'idéal serait de trouver le moyen de faire ça quelle que soit l'extension.

n°2421941
slr56
Tout problème a sa solution.
Posté le 13-07-2022 à 12:31:08  profilanswer
 

Bonjour,
 
J'ai besoin d'un coup de main.
Je suis en train de développer un script pour configurer des machines.
 
 
J'ai une variable (type booléen) qui regarde s'il y a un mot de passe sur le BIOS.
 

Code :
  1. $VERIFMDP=Get-HPBiosSetupPasswordIsSet


 
Sur le PC de test, la variable me retourne "True".
 
Si je fais ($VERIFMDP="True" ) {Write-Host "coucou"}, ça marche.
 
Si je fais ($VERIFMDP="False" ) {Write-Host "coucou"}, ça marche également....   :pfff:  
Et ça fonctionne avec n'importe quelle valeur affectée à $VERIFMDP :(
 
Je pense à une erreur d'interprétation du fait du type mais je ne sais pas comment corriger. J'ai essayé avec $VERIFMDP.ToString() mais c'est pareil.  
 
Comment corriger ?

Message cité 2 fois
Message édité par slr56 le 13-07-2022 à 12:33:42

---------------
Configurations type du moment : https://forum.hardware.fr/hfr/Hardw [...] 1331_1.htm  https://www.jouannetphotographe.com
n°2421942
arnuche
Posté le 13-07-2022 à 13:15:32  profilanswer
 

Quant à moi j'ai trouvé la solution à mon souci en me basant sur ce cas ;
https://stackoverflow.com/questions [...] underscore
 
ce qui donne dans mon cas ;
Get-Childitem -Path "K:\test" | ForEach-Object { $_ | Rename-Item -NewName { $_.Name -replace "( chemise (\d{1}))+(?=$($_.Extension)$)", " chemise" }}
autre possibilité ;
Get-Childitem -Path "K:\test" | ForEach-Object { $_ | Rename-Item -NewName { $_.Name -replace "( chemise (\d{1}))+(?=\.[^.]+$)", " chemise" }}
 :sol:

n°2421944
rorosk
Posté le 13-07-2022 à 13:27:44  profilanswer
 

slr56 a écrit :

Bonjour,
 
J'ai besoin d'un coup de main.
Je suis en train de développer un script pour configurer des machines.
 
 
J'ai une variable (type booléen) qui regarde s'il y a un mot de passe sur le BIOS.
 

Code :
  1. $VERIFMDP=Get-HPBiosSetupPasswordIsSet


 
Sur le PC de test, la variable me retourne "True".
 
Si je fais ($VERIFMDP="True" ) {Write-Host "coucou"}, ça marche.
 
Si je fais ($VERIFMDP="False" ) {Write-Host "coucou"}, ça marche également....   :pfff:  
Et ça fonctionne avec n'importe quelle valeur affectée à $VERIFMDP :(
 
Je pense à une erreur d'interprétation du fait du type mais je ne sais pas comment corriger. J'ai essayé avec $VERIFMDP.ToString() mais c'est pareil.  
 
Comment corriger ?


En PowerShell, = est l'opérateur d'assignation, avec un booléen, if suffit de faire

if ($VERIFMDP) {Write-Host "coucou"}


 

n°2421945
Je@nb
Kindly give dime
Posté le 13-07-2022 à 13:28:31  profilanswer
 

slr56 a écrit :

Bonjour,
 
J'ai besoin d'un coup de main.
Je suis en train de développer un script pour configurer des machines.
 
 
J'ai une variable (type booléen) qui regarde s'il y a un mot de passe sur le BIOS.
 

Code :
  1. $VERIFMDP=Get-HPBiosSetupPasswordIsSet


 
Sur le PC de test, la variable me retourne "True".
 
Si je fais ($VERIFMDP="True" ) {Write-Host "coucou"}, ça marche.
 
Si je fais ($VERIFMDP="False" ) {Write-Host "coucou"}, ça marche également....   :pfff:  
Et ça fonctionne avec n'importe quelle valeur affectée à $VERIFMDP :(
 
Je pense à une erreur d'interprétation du fait du type mais je ne sais pas comment corriger. J'ai essayé avec $VERIFMDP.ToString() mais c'est pareil.  
 
Comment corriger ?


 
Tes ($VERIFMDP="True" ) ça veut rien dire.
 
Tu fais if ($verifmdp) et zou, ou directement If (Get-HPBiosSetupPasswordIsSet) si tu l'appelles qu'une fois.
L'opérateur de comparaison en powershell c'est -eq

n°2421948
slr56
Tout problème a sa solution.
Posté le 13-07-2022 à 13:51:43  profilanswer
 

Merci à tous les 2. J'aurai appris quelque chose aujourd'hui sur PowerShell :)


---------------
Configurations type du moment : https://forum.hardware.fr/hfr/Hardw [...] 1331_1.htm  https://www.jouannetphotographe.com
n°2422101
gamer-fou
AHHHHHH§§§!!!
Posté le 15-07-2022 à 20:35:49  profilanswer
 

J'ai des comportements bizarres avec du code qui est exécuté par une version linux de l'image docker azure-powershell de Microsoft [:transparency]
Par exemple :

Citation :

$Date = get-date

 

$Date.GetType().Name

 

> DateTime

 

$date.adddays(1)

 

> Error : system.string does not contain a method named adddays


[:gratgrat]

 

Ou bien une variable déclarée dans les Param() mais jamais initialisée a la valeur "" au lieu de $null (et donc un test $variable -eq $null retourne False) [:gratgrat]

 


J'arrive pas à savoir si c'est lié au côté "linux", "image docker" ou bien complètement autre chose [:gratgrat]

 

Edit: pour le second cas c'est possiblement parce que je caste explicitement le param en [string], j'aurai pas accès à mon code avant lundi pour verifier

Message cité 1 fois
Message édité par gamer-fou le 15-07-2022 à 22:42:03

---------------
Music is the most high!
n°2422278
slr56
Tout problème a sa solution.
Posté le 18-07-2022 à 13:29:24  profilanswer
 

Bonjour,

 

J'ai un dossier dans c: avec des outils d'administration et je veux que seuls les admin puissent y accéder.
Dans un Powershell, j'ai cette commande qui fonctionne :

 
Code :
  1. icacls.exe .\mondossier /inheritance:r /grant Administrateurs:F
 


Je voudrais savoir si cette commande est propre et surtout sans risque.

 

Cdt,


Message édité par slr56 le 18-07-2022 à 13:44:59

---------------
Configurations type du moment : https://forum.hardware.fr/hfr/Hardw [...] 1331_1.htm  https://www.jouannetphotographe.com
n°2422282
Je@nb
Kindly give dime
Posté le 18-07-2022 à 13:59:59  profilanswer
 

gamer-fou a écrit :

J'ai des comportements bizarres avec du code qui est exécuté par une version linux de l'image docker azure-powershell de Microsoft [:transparency]
Par exemple :

Citation :

$Date = get-date
 
$Date.GetType().Name
 
> DateTime
 
$date.adddays(1)
 
> Error : system.string does not contain a method named adddays


[:gratgrat]
 
Ou bien une variable déclarée dans les Param() mais jamais initialisée a la valeur "" au lieu de $null (et donc un test $variable -eq $null retourne False) [:gratgrat]
 
 
J'arrive pas à savoir si c'est lié au côté "linux", "image docker" ou bien complètement autre chose [:gratgrat]
 
Edit: pour le second cas c'est possiblement parce que je caste explicitement le param en [string], j'aurai pas accès à mon code avant lundi pour verifier


 
Bizarre ça fonctionne bien dans mon docker moi (dans ACI) :

PS /> $date=get-date
PS /> $date.GetType().Name
DateTime
PS /> $date.AddDays(1)
 
Tuesday, July 19, 2022 11:59:23 AM

n°2436713
guineaspig
Turbulé de l'onde MEGA
Posté le 29-12-2022 à 19:45:39  profilanswer
 

Bonjour,
 
question de débutant :
 
comment je fais pour que quand je lance ce script en double cliquant dessus, la commande de pause s'exécute à la fin et non au milieu :/
Le but est que la fenêtre ne se ferme pas de suite mais me laisse le temps de voir les sorties.
 

Code :
  1. Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher | Where { $_.DisplayName -like "*google*" } | Format-Table -AutoSize
  2. Get-Service | Where-Object {$_.name -like "*google*"} | Select DisplayName,Status,starttype
  3. Read-Host -Prompt "Appuyez sur une touche"


 
Je ne comprends pas trop pourquoi l'exécution n'est pas séquentielle. J'ai essayé plein de trucs trouvés sur Internet mais ça marche pas :(

n°2436734
lestat67se​l
:-)
Posté le 29-12-2022 à 22:09:28  profilanswer
 

Je savais pas, j'aurais appris un truc aussi, la réponse dans le lien :
https://stackoverflow.com/questions [...] e-the-code

 

Sinon ça marche pas comme tu veux si a la place du read-host tu mets un start-sleep ?

n°2436747
guineaspig
Turbulé de l'onde MEGA
Posté le 30-12-2022 à 08:32:15  profilanswer
 

Merci beaucoup ca marche :)
J'ai pourtant cherché et tenté de remplacer le read-host par du sleep, du pause, etc.
J'ai tenté les workflow avec sequence aussi en vain.
Il y avait aussi le paramètre -noexit au lancement du script mais cela ne permet pas de simplement double-cliquer sur le script.

n°2439067
lestat67se​l
:-)
Posté le 26-01-2023 à 16:28:51  profilanswer
 

Je tente ici on sait jamais.
 
J'ai du script qui utilise du PowerCLI pour aller chercher des infos dans notre infra VMWare.
Pour faire de la gestion de Tag (et que ca marche), j'ai dû upgrade la version de PowerCLI sur la dernière (au moment là en 12), seulement apparemment depuis le version 11, ça met des plombes à charger à l'import dans Powershell
 
Parce qu'il y a beaucoup de module pas forcément utile (tout ceux marqué SDK)
Parce qu'au chargement des modules il va apparemment faire des checks sur le net.
 
Résultat ca mets 5min à charger au moins quand je suis en GUI. et si je veux lancer le script via notre ordonnanceur ca aboutit carrément jamais (genre 2j après le module est toujours pas chargé :o )
 
j'ai viré tous les modules qui me sont pas utile > change rien
Je suis tombé sur ces astuces: https://communities.vmware.com/t5/V [...] -p/1828490
> change rien.
 
Du coup je cherche si jamais quelqu'un avait fini par trouver une solution ...  :cry:


Message édité par lestat67sel le 26-01-2023 à 16:30:09
n°2439068
Je@nb
Kindly give dime
Posté le 26-01-2023 à 16:48:02  profilanswer
 

Les modules doivent être signés et powershell doit essayer de se connecter à la CRL j'imagine.
Suffit soit de laisser l'accès la CRL, soit de fail fast en ne faisant pas de résolution dns ou une erreur, plutôt que d'attendre un timeout soit désactiver le check de CRL (non recommandé puisque global au système et pas juste pour ces histoire de chargement de modules)

 

au pire tu peux regarder ça pour réduire l'attente https://technotes.khitrenovich.com/ [...] ironments/


Message édité par Je@nb le 26-01-2023 à 16:49:37
n°2439075
MilesTEG1
Posté le 27-01-2023 à 07:12:16  profilanswer
 

Hi un TU powershell  :D  
 [:michrone]


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°2442349
gamer-fou
AHHHHHH§§§!!!
Posté le 11-03-2023 à 11:30:41  profilanswer
 

Quelqu'un a déjà joué un peu avec DSC v3/guest configuration renommé en "automanage machine configuration" maintenant?

 

J'aime vraiment le concept avec des packages qui contiennent le mof et ses dépendances + l'assignement d'un package à une vm via guest assignment, par contre j'ai l'impression qu'ils ont complètement zappé la partie gestion des secrets/credentials [:joce]


Message édité par gamer-fou le 11-03-2023 à 11:31:36

---------------
Music is the most high!
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8

Aller à :
Ajouter une réponse
 

Sujets relatifs
Créer un lien hypertexte en powershellRemplacer une lettre dans .txt POWERSHELL
Comment faire un saut à la ligne PowershellRécupérer la date du résultat [POWERSHELL]
[POWERSHELL] Récupérer les utilisateurs sur un serveur TSE[Powershell] Récupérer SID
Faire des scripts quant ta 0 connaissance =( PowerShell[PowerShell] Script de colorisation de syllabes
Powershell - unrestricted mais erreur de droits d'execution[Powershell] recuperer un argument
Plus de sujets relatifs à : Powershell[Topic Unik]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR