Problème avec la variable et la redirection
Résolu/Fermé
Azert_78
Messages postés
15
Date d'inscription
mardi 31 mai 2022
Statut
Membre
Dernière intervention
9 juin 2022
-
31 mai 2022 à 11:40
brucine Messages postés 17731 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 18 novembre 2024 - 2 juin 2022 à 23:30
brucine Messages postés 17731 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 18 novembre 2024 - 2 juin 2022 à 23:30
A voir également:
- Problème avec la variable et la redirection
- Impossible de créer le fichier de travail. vérifiez la variable d'environnement temp ✓ - Forum Windows 10
- Le fichier contient un programme écrit en python. le programme construit un mot secret mais il ne l'affiche pas. modifiez ce programme afin que à chaque itération de la boucle : la variable a augmente de 2 la variable b diminue de 1 ajoutez une instruction pour faire afficher le mot secret construit. quel est ce mot secret ? ✓ - Forum Python
- Variable d'environnement TEMP ✓ - Forum Windows 7
- Python ✓ - Forum Python
2 réponses
brucine
Messages postés
17731
Date d'inscription
lundi 22 février 2021
Statut
Membre
Dernière intervention
18 novembre 2024
2 579
31 mai 2022 à 13:47
31 mai 2022 à 13:47
Bonjour,
En principe le chemin C:\Users\test\Desktop\1 doit suffire avec une syntaxe:
Get-ChildItem $dossier -Recurse -File | Where CreationTime -lt (Get-Date).AddDays($HTT) | Move-Item -Destination "C:\Users\test\Desktop\2"
Si les variables y sont supportées (vérifier la syntaxe en remplaçant la première par sa valeur éventuellement précédée de -Path et la deuxième par -15 ou ce qu'on voudra).
En principe le chemin C:\Users\test\Desktop\1 doit suffire avec une syntaxe:
Get-ChildItem $dossier -Recurse -File | Where CreationTime -lt (Get-Date).AddDays($HTT) | Move-Item -Destination "C:\Users\test\Desktop\2"
Si les variables y sont supportées (vérifier la syntaxe en remplaçant la première par sa valeur éventuellement précédée de -Path et la deuxième par -15 ou ce qu'on voudra).
Azert_78
Messages postés
15
Date d'inscription
mardi 31 mai 2022
Statut
Membre
Dernière intervention
9 juin 2022
31 mai 2022 à 14:17
31 mai 2022 à 14:17
N'y a t'il pas moyen de garder mon scrpt de base et une solution pour la variable $var soit prise en compte ?
brucine
Messages postés
17731
Date d'inscription
lundi 22 février 2021
Statut
Membre
Dernière intervention
18 novembre 2024
2 579
31 mai 2022 à 17:42
31 mai 2022 à 17:42
Je ne suis pas un expert PowerShell, juste quelques remarques:
-à première vue, * dans la source ne change rien au schmilblick
-les variables de Write-Host retournent une forme:
01/05/2016 06:48:00 | batchtemps.html | 25586
qui va immanquablement provoquer des erreurs puisque ce nom de variable comporte des caractères interdits dans un nom de fichier et n'en représentent ni exactement le nom (batchtemps.html) et encore moins le chemin
(H:\archives\batch\date\batchtemps.html).
Les pipes dont echo texte "|" en rajoutent, si on devait garder ce format, il faudrait les échapper.
Il va être meilleur d'utiliser:
$var = Get-ChildItem $dossier -Recurse | foreach {if ($_.LastWriteTime -le (Get-Date).AddDays($HTT)){Write-Host $_.Name}}
-la variable retourne les noms de fichier (c'est ce qu'on lui demande) mais aussi les noms de sous-dossiers et là, on a un os, on n'a aucune raison de déplacer les dossiers s'ils ne sont pas vides ou s'ils contiennent des fichiers "non périmés".
Peut-être convient-il dans ces conditions de tester non pas la date des fichiers, mais celle des dossiers eux-mêmes, mais ça laisserait ces dossiers en l'état tant que tous les fichiers n'y sont pas périmés.
-enfin, la syntaxe de déplacement ne peut qu'échouer soit parce qu'elle rencontre la première valeur vide, soit parce que par nature la syntaxe $var précédente parcourt tous les dossiers avant d'être lue (et qu'à la fin par définition elle est vide), enfin parce que le chemin $var est invalide: il faudrait qu'il décrive H:\archives\batch\date\batchtemps.html et non pas batchtemps.html.
Je n'ai pas, avant de chercher, de solution, mais le principe (outre les noms de dossier superflus et le chemin absent) est que la condition Move doit être incluse dans la sentence $var dans une boucle pour être lue à chaque fois (d'où l'intérêt de se passer de cette variable.)
Noter qu'on obtient le même résultat avec beaucoup moins de fatigue via un batch ROBOCOPY:
@echo off
ROBOCOPY "C:\Users\test\Desktop\1" " C:\Users\test\Desktop\2" /MOVE /MINAGE:30 /COPYALL /S
:EOF
déplace tout ce qui est plus vieux que le nombre de jours (ici 30) et tue tout ce qui est ancien dans la source, laissant les dossiers vides si j'utilise MOV, les tuant aussi si j'utilise MOVE.
https://ss64.com/nt/robocopy.html
-à première vue, * dans la source ne change rien au schmilblick
-les variables de Write-Host retournent une forme:
01/05/2016 06:48:00 | batchtemps.html | 25586
qui va immanquablement provoquer des erreurs puisque ce nom de variable comporte des caractères interdits dans un nom de fichier et n'en représentent ni exactement le nom (batchtemps.html) et encore moins le chemin
(H:\archives\batch\date\batchtemps.html).
Les pipes dont echo texte "|" en rajoutent, si on devait garder ce format, il faudrait les échapper.
Il va être meilleur d'utiliser:
$var = Get-ChildItem $dossier -Recurse | foreach {if ($_.LastWriteTime -le (Get-Date).AddDays($HTT)){Write-Host $_.Name}}
-la variable retourne les noms de fichier (c'est ce qu'on lui demande) mais aussi les noms de sous-dossiers et là, on a un os, on n'a aucune raison de déplacer les dossiers s'ils ne sont pas vides ou s'ils contiennent des fichiers "non périmés".
Peut-être convient-il dans ces conditions de tester non pas la date des fichiers, mais celle des dossiers eux-mêmes, mais ça laisserait ces dossiers en l'état tant que tous les fichiers n'y sont pas périmés.
-enfin, la syntaxe de déplacement ne peut qu'échouer soit parce qu'elle rencontre la première valeur vide, soit parce que par nature la syntaxe $var précédente parcourt tous les dossiers avant d'être lue (et qu'à la fin par définition elle est vide), enfin parce que le chemin $var est invalide: il faudrait qu'il décrive H:\archives\batch\date\batchtemps.html et non pas batchtemps.html.
Je n'ai pas, avant de chercher, de solution, mais le principe (outre les noms de dossier superflus et le chemin absent) est que la condition Move doit être incluse dans la sentence $var dans une boucle pour être lue à chaque fois (d'où l'intérêt de se passer de cette variable.)
Noter qu'on obtient le même résultat avec beaucoup moins de fatigue via un batch ROBOCOPY:
@echo off
ROBOCOPY "C:\Users\test\Desktop\1" " C:\Users\test\Desktop\2" /MOVE /MINAGE:30 /COPYALL /S
:EOF
déplace tout ce qui est plus vieux que le nombre de jours (ici 30) et tue tout ce qui est ancien dans la source, laissant les dossiers vides si j'utilise MOV, les tuant aussi si j'utilise MOVE.
https://ss64.com/nt/robocopy.html
brucine
Messages postés
17731
Date d'inscription
lundi 22 février 2021
Statut
Membre
Dernière intervention
18 novembre 2024
2 579
>
brucine
Messages postés
17731
Date d'inscription
lundi 22 février 2021
Statut
Membre
Dernière intervention
18 novembre 2024
31 mai 2022 à 20:51
31 mai 2022 à 20:51
Si tu tiens absolument à ta variable, là, on est bon à condition qu'il n'y ait pas 2 fichiers qui portent le même nom, puisque la sortie se fait de tous les fichiers sans sous-dossier dans le dossier de destination, et à condition que le dossier se destination soit créé préalablement:
$HTT=-30
$dossier="H:\archives\batch\"
$destination="G:\archives"
$var = Get-ChildItem -Path $dossier -Recurse -File | where-object {$_.LastWriteTime -le (Get-Date).AddDays($HTT)}| Copy-Item -destination $destination
Azert_78
Messages postés
15
Date d'inscription
mardi 31 mai 2022
Statut
Membre
Dernière intervention
9 juin 2022
>
brucine
Messages postés
17731
Date d'inscription
lundi 22 février 2021
Statut
Membre
Dernière intervention
18 novembre 2024
1 juin 2022 à 09:56
1 juin 2022 à 09:56
Et dernière petite question c'est possible de supprimer les fichiers copiés car la il y a les fichiers de l'archive et les fichiers qui ont été copié sont toujours la, comment pourrais-je les supprimés ?
brucine
Messages postés
17731
Date d'inscription
lundi 22 février 2021
Statut
Membre
Dernière intervention
18 novembre 2024
2 579
>
Azert_78
Messages postés
15
Date d'inscription
mardi 31 mai 2022
Statut
Membre
Dernière intervention
9 juin 2022
1 juin 2022 à 10:18
1 juin 2022 à 10:18
Bonjour,
J'ai fait Copy-Item pour pouvoir réagir en cas d'ânerie avant qu'il ne soit trop tard: après avoir vérifié que la copie est correcte, supprimer tous les fichiers du dossier de destination et remplacer par Move-Item.
Ou bien utiliser un batch avec la syntaxe ROBOCOPY qui fait le job en une ligne (sauf à en rajouter 2 autres pour remplacer via SET les noms de dossier par des variables, ie SET dossier="C:\Users\test\Desktop\1")
J'ai fait Copy-Item pour pouvoir réagir en cas d'ânerie avant qu'il ne soit trop tard: après avoir vérifié que la copie est correcte, supprimer tous les fichiers du dossier de destination et remplacer par Move-Item.
Ou bien utiliser un batch avec la syntaxe ROBOCOPY qui fait le job en une ligne (sauf à en rajouter 2 autres pour remplacer via SET les noms de dossier par des variables, ie SET dossier="C:\Users\test\Desktop\1")
brucine
Messages postés
17731
Date d'inscription
lundi 22 février 2021
Statut
Membre
Dernière intervention
18 novembre 2024
2 579
>
brucine
Messages postés
17731
Date d'inscription
lundi 22 février 2021
Statut
Membre
Dernière intervention
18 novembre 2024
1 juin 2022 à 10:29
1 juin 2022 à 10:29
Si tu veux aussi tester la deuxième solution, je rappelle qu'en batch les variables ne s'expriment pas par $var mais par %var% et qu'elles ne s'affichent pas d'emblée ($var=) mais par le biais d'une commande appropriée (echo %var%).