Tu peux aussi mettre à jour Powershell.
Pour connaitre la version, dans la console Powerhsell tapeCode:$PSVersionTable.PSVersion.ToString()
D'ailleurs quel est ton os ?
Version imprimable
Tu peux aussi mettre à jour Powershell.
Pour connaitre la version, dans la console Powerhsell tapeCode:$PSVersionTable.PSVersion.ToString()
D'ailleurs quel est ton os ?
Suite à tes conseils, je viens d'installer PowerShell 3.0 (j'étais en 2.0).
Maintenant, l'option -LiteralPath fonctionne ! :D
J'ai ainsi pu exécuter cette commande avec "presque" succès :
Le "presque" vient du fait que seul les dossiers à la racine du chemin (\\serveur-sig\SIG\[ADMIN_SIG]) sont scannés, pas les sous-dossiers.Code:Get-ChildItem -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\"| Where-Object {$_.PSIsContainer -eq $true -and $_.LastWriteTime -ge (Get-Date).AddDays(-10)} | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv -Delimiter ";" -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\expo.txt" -NoTypeInformation
Y a-t-il une option pour ajouter les sous-dossiers de manière récursive ?
Je suis sur un poste Windows 7 Pro (64bit) pour mes tests, mais dès que ça marche, je lancerai le script depuis un serveur Windows Server 2008 (via tâche planifiée).Citation:
Envoyé par ericlm128
(faudra que je vois avec l'administrateur du serveur si on peut mettre à jour et si l’exécution de script powershell (Set-ExecutionPolicy Unrestricted) ne pose pas de souci sur le serveur)
"Get-ChildItem" possède un paramètre "-Recurse" pour scanner les sous-dossier.
Il faudra vérifier la version de Powershell sur ton Server 2008.
Powershell possède un paramètre pour s'affranchir de la politique de sécurité pour un script
https://blog.netspi.com/15-ways-to-b...cution-policy/Citation:
PowerShell.exe -ExecutionPolicy Bypass -File .runme.ps1
http://9to5it.com/bypass-the-powersh...cution-policy/
Je viens de l'ajouter à la commande, et maintenant le fichier d'export est vide !?Citation:
Envoyé par ericlm128
J'ai essayé ces toutes ces variantes, rien ne marche :
Code:
1
2
3
4
5
6
7
8
9
10
11 # le script qui marche (mais sans les sous-dossiers) : Get-ChildItem -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\" | Where-Object {$_.PSIsContainer -eq $true -and $_.LastWriteTime -ge (Get-Date).AddDays(-10)} | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv -Delimiter ";" -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\export.csv" -NoTypeInformation # avec -Recurse [ne marche pas] Get-ChildItem -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\" -Recurse | Where-Object {$_.PSIsContainer -eq $true -and $_.LastWriteTime -ge (Get-Date).AddDays(-10)} | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv -Delimiter ";" -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\export.csv" -NoTypeInformation # avec -Recurse -Force [ne marche pas] Get-ChildItem -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\" -Recurse -Force | Where-Object {$_.PSIsContainer -eq $true -and $_.LastWriteTime -ge (Get-Date).AddDays(-10)} | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv -Delimiter ";" -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\export.csv" -NoTypeInformation # avec -Recurse au début [ne marche pas] Get-ChildItem -Recurse -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\" | Where-Object {$_.PSIsContainer -eq $true -and $_.LastWriteTime -ge (Get-Date).AddDays(-10)} | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv -Delimiter ";" -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\export.csv" -NoTypeInformation
Qu'est-ce que je n'écris pas comme il faut ?
La deuxième solution fonctionne correctement chez moi.
Je suis sous Windows 7 64 bits intégrale et Powershell 3.0, autrement dit quasiment comme toi.
Tu n'a peut être pas de dossier (sous-dossier) modifiés dans les 10 derniers jours ? :D
Peut être que tu n'a pas accès à toute l'arborescence des sous-dossier (problème de droits d'accès dans un dossier).
Peut être que ton fichier expo.csv était verrouillé par un autre process ? (Excel ...). Ou que tu n'a pas les droits d'écritures sur cette ressource ?
Tu as un message d'erreur ?
Voici ce que je lance (# pour commenter ce qui suis)
Code:
1
2 $rep = "." #\\serveur-sig\SIG\[ADMIN_SIG]\" Get-ChildItem -LiteralPath $rep -Recurse | Where-Object {$_.PSIsContainer -eq $true -and $_.LastWriteTime -ge (Get-Date).AddDays(-10)} | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv -Delimiter ";" -LiteralPath "$rep\export.csv" -NoTypeInformation
Bonjour, et désolé pour ce silence (je suis passé sur d'autres sujets entre temps)
Si si, j'en ai (je suis sur un dossiers de tests, et j'ai créé des sous-dossiers aujourd'hui, avec des fichiers textes dedans pour tests).Citation:
Tu n'a peut être pas de dossier (sous-dossier) modifiés dans les 10 derniers jours ?
Je suis connecté en tant qu'administrateur sur la machine, ainsi que sur le serveur...Citation:
Peut être que tu n'a pas accès à toute l'arborescence des sous-dossier (problème de droits d'accès dans un dossier).
Et j'ai bien les droits complets sur les dossiers scannés...
Mais je viens de me rendre compte d'un problème : quand j’exécute le script avec le paramètre "-Recurse", celui-ci ne s'arrête pas ! (le bouton "arrêter l’exécution" reste rouge)
Mais je n'ai pas de message d'erreur.
Le fichier est créé tout de suite, mais l'execution du script reste bloquée.
Y a-t-il une console qui permet de savoir sur quoi bloque le fichier ?
Je viens de lancer la même commande sur un dossier local, et là, ça fonctionne :
Code:
1
2 $rep = "C:\Users\Sylvain\Desktop" #\\serveur-sig\SIG\[ADMIN_SIG]\" Get-ChildItem -LiteralPath $rep -Recurse | Where-Object {$_.PSIsContainer -eq $true -and $_.LastWriteTime -ge (Get-Date).AddDays(-10)} | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv -Delimiter ";" -LiteralPath "C:\Users\Sylvain\Desktop\export.txt" -NoTypeInformation
??
en complément, ce script se lance bien et se termine avec succès :
Ce srcipt scanne un dossier local, mais écrit sur le serveur.Code:
1
2 $rep = "C:\Users\Sylvain\Desktop" #\\serveur-sig\SIG\[ADMIN_SIG]\" Get-ChildItem -LiteralPath $rep -Recurse | Where-Object {$_.PSIsContainer -eq $true -and $_.LastWriteTime -ge (Get-Date).AddDays(-10)} | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv -Delimiter ";" -LiteralPath "\\serveur-sig\SIG\[ADMIN_SIG]\export.txt" -NoTypeInformation
Donc, c'est le scan qui pose problème, pas l'écriture.
Oui mais ... du coup ... ton dossier "\\serveur-sig\SIG\[ADMIN_SIG]\" n'aurait pas des milliers/millions de dossiers/fichiers par hasard ? Ce qui pourrait justifier la lenteur, pacque ça n'a pas l'air planté mais juste lent ?
Non non, ça reste "raisonnable" :
\\serveur-sig\SIG\[ADMIN_SIG] : 429 Fichiers, 137 Dossiers
Pour comparaison :
C:\Users\Sylvain\Desktop : 4740 Fichiers, 380 Dossiers
(et l'execution du scan ne prend qu'une seconde ou 2)
Oui ça reste raisonnable. Mais il est difficile de comparer des temps de réponse entre des ressources locales et distantes.
Pour ma part j'ai tenter sur une de nos ressource serveur. 449 fichier/190 dossiers ça met 1 à 2 secondes.
Tu peut lancer le script à partir d'un autre poste ? Directement depuis le serveur ?
Essaie avec la commande forfiles :
https://technet.microsoft.com/fr-fr/...(v=ws.10).aspx
en executant la commande "echo @relpath" dans le paramètres /c
J'espère que ça pourra t'aider :)
Merci de ta proposition, mais nous avons essayé et le filtre par date ("/D -10") ne semble pas fonctionner...Citation:
Envoyé par BlueBuru
Voici le code proposé par Eric :
Qui me récupère étrangement tous les dossier, et non uniquement ceux modifiés depuis 10 jours...Code:
1
2
3
4 @echo off set outfile=%~dp0outfile.txt echo CHEMIN;DATE_MODIF>%outfile% forfiles /S /D -10 /C "cmd /c If @isdir==TRUE echo @path;@fdate>>%outfile%"
Bonjour,
Désolé de ne revenir qu'aujourd'hui sur ce post, mais j'étais appelé sur d'autres priorités.
Je viens de le faire, après avoir mis à jour Powershell (3.0).Citation:
Envoyé par ericlm128
Malheureusement, le fichier d'export reste désespérément vide après ce code :
Idem avec celui-ci :Code:Get-ChildItem -LiteralPath "C:\SIG\[ADMIN_SIG]\" -Recurse| Where-Object {$_.PSIsContainer -eq $true -and $_.LastWriteTime -ge (Get-Date).AddDays(-10)} | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv -Delimiter ";" -LiteralPath "C:\SIG\[ADMIN_SIG]\expo.txt" -NoTypeInformation
:? Si vous avez une idée de la cause... :?Code:
1
2 $rep = "C:\SIG\[ADMIN_SIG]\" Get-ChildItem -LiteralPath $rep -Recurse | Where-Object {$_.PSIsContainer -eq $true -and $_.LastWriteTime -ge (Get-Date).AddDays(-10)} | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv -Delimiter ";" -LiteralPath "C:\SIG\[ADMIN_SIG]\export.txt" -NoTypeInformation
Je me permets de relancer cette discussion, car je ne suis pas parvenu à mes fins depuis ces échanges de 2017.
Mes besoins ont quelque peu évolué depuis, mais la demande reste globalement la même, à savoir : lister les répertoires et fichiers d'un dossier (en fait, tout un serveur), avec les informations de dates (création, modification, accès), de poids et de chemin.
Je ne souhaite plus filtrer par date le résultat, car l'objectif est d'importer ce listing dans une base de données (PostGreSQL), sur laquelle je fais des requêtes d'analyses.
Le script BATCH de cette discussion a bien fonctionné, mais a mis plus d'une semaine à s’exécuter...
J'ai entre temps découvert Locate32 (https://locate32.cogit.net/), qui fait ce job en quelques minutes sur mon serveur !!
Malheureusement, la base de données de Locate32 est au format Binaire, et je ne sais pas comment l'utiliser dans un format tabulaire (puisque l'objectif final est une table PostGreSQL).
(j'ai posé une question à ce sujet sur leur forum)
Entre BATCH ou POWERSHELL, je n'ai pas de préférence : pourvu que ça marche, et que ça prenne moins d'une journée de scan ! ;)
Merci pour votre aide !
Sylvain M.
Et bien après avoir survoler le post je reprend la même idée qui fonctionne toujours chez moi ;)
Code:
1
2
3
4 $rep = "C:\" $outfile = "C:\out.csv" Get-ChildItem -LiteralPath $rep -Recurse -ErrorAction SilentlyContinue | Select-Object FullName, Length, CreationTime, LastWriteTime, LastAccessTime | Export-Csv -Delimiter ";" -LiteralPath $outfile -NoTypeInformation
Oui, je viens de tester sur mon PC, et ça fonctionne du tonnerre !!! :DCitation:
Envoyé par ericlm128
J'allais ensuite t'écrire que, malheureusement, ça ne fonctionnait pas sur mon serveur... sniff :(
Mais j'ai enfin identifié le problème 8-) : le chemin du répertoire à scanner comportait les caractères [ et ].
Et c'est finalement ce qui faisait planter le script (j'obtenais un fichier CSV vide).
Du coup, je lance dès ce soir le scan du serveur complet : je verrai demain combien de temps il aura mis pour scanner tout le serveur !
MERCI !!! :D
Le scan est en cours, mais en regardant le contenu du fichier CSV généré (sur un copie pour ne pas influencer l'écriture en cours), je constate que les accents ne sont pas bien gérés dans les chemins : ils sont remplacés par des points d'interrogation.
As-tu une idée pour ce point précis ?
A demain pour la suite ! :D
Oui tout à fait, ceci est du à l'encodage tu fichier tu peux essayer comme ceci en UTF8
Code:
1
2
3
4 $rep = "C:\" $outfile = "C:\out.csv" Get-ChildItem -LiteralPath $rep -Recurse -ErrorAction SilentlyContinue | Select-Object FullName, Length, CreationTime, LastWriteTime, LastAccessTime | Export-Csv -Delimiter ";" -LiteralPath $outfile -NoTypeInformation -Encoding UTF8
Incroyable 8O : le scan s'est terminé hier au bout de 20 min (contre, je le rappelle, plus d'une semaine avec la version Batch). Trop fort, Powershell !!! :DCitation:
Envoyé par SylvainM
(et en fait, il y a 1 274 272 fichiers et dossiers !!!! 8O)
Pour ce qui est du problème d'encodage, le paramètre proposé fonctionne parfaitement ! :D
Mon problème est donc 100% résolu cette fois : merci ericlm128 :D