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 17120 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 10 octobre 2024 - 2 juin 2022 à 23:30
Bonjour,

J'ai un problème avec mon script qui à pour but de lister les fichiers non-utilisés depuis un certain et je dois ensuite les rediriger vers un répertoire archive.

Voici mon script :



$HTT = -2

$dossier = "C:\Users\test\Desktop\1\*"

$var = Get-ChildItem $dossier -Recurse | foreach {if ($_.LastWriteTime -le (Get-Date).AddDays($HTT)){Write-Host $_.LastWriteTime "|" $_.Name "|" $_.Length}}

Move-Item $var C:\Users\test\Desktop\2

Et voici l'erreur :

Move-Item : Impossible de lier l'argument au paramètre « Path », car il a la valeur Null.
Au niveau de C:\Users\test\Desktop\allez.ps1 : 5 Caractère : 10
+ Move-Item <<<< $var C:\Users\test\Destkop\2
+ CategoryInfo : InvalidData: (:) [Move-Item], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.MoveItemCommand

Merci pour les aides que vous me fournirez.

Configuration: Windows / Chrome 102.0.5005.61

2 réponses

brucine Messages postés 17120 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 10 octobre 2024 2 434
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).
0
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
N'y a t'il pas moyen de garder mon scrpt de base et une solution pour la variable $var soit prise en compte ?
0
brucine Messages postés 17120 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 10 octobre 2024 2 434
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
0
brucine Messages postés 17120 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 10 octobre 2024 2 434 > brucine Messages postés 17120 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 10 octobre 2024
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
0
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 17120 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 10 octobre 2024
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 ?
0
brucine Messages postés 17120 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 10 octobre 2024 2 434 > 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
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")
0
brucine Messages postés 17120 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 10 octobre 2024 2 434 > brucine Messages postés 17120 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 10 octobre 2024
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%).
0