Question Déplacement de fichiers en fonction de leur nom

Plus d'informations
il y a 13 ans 7 mois #12444 par dimitri
Bonjour à tous,

Je commence tout juste sur PowerShell... Je souhaite interpréter cet algo via PowerShell:

Parcours d'un répertoire
Récupération des noms de fichiers

Si un fichier commence par \"ATX\" alors
On déplace vers \"D:\rep1\"


Si un fichier commence par \"APX\" alors
On déplace vers \"D:\rep2\"

...

Je ne sais pas comment m'y prendre, merci pour votre aide<br><br>Message édité par: dimitri, à: 30/07/12 11:47

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

Plus d'informations
il y a 13 ans 7 mois #12445 par SiSMik
Bonsoir,

Il est possible de lister un répertoire avec la commande Get-ChildItem . Donc tu peux partir sur quelque chose du style pour lister le répertoire

[code:1]
$Repertoire = \&quot;C:\Temp\\&quot;
$Fichiers = Get-ChildItem $Repertoire
[/code:1]

Ensuite pour traiter la liste des fichiers, il faut traiter chaque répertoire contenu dans la $ListRepertoire avec Foreach-Object

[code:1]
Foreach ( $Fichier in $Fichiers ) {
$Fichier
}
[/code:1]

Maintenant qu'on arrive à traiter les répertoire un par un, il faut trouver la propriété de $Rep qui contiendra le nom du fichier.

Pour connaitre les méthodes et les propriétés d'un objet tu peux utiliser la commande Get-Member

Si tu exécutes ce code

[code:1]
$Fichiers | Get-Member
[/code:1]

Tu auras quelque chose comme ça

TypeName: System.IO.DirectoryInfo

Name MemberType Definition
----



Mode CodeProperty System.String Mode{get=Mode;}
Create Method System.Void Create(System.Security.AccessControl.DirectorySecurity directorySecurity), System.Void Create()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
CreateSubdirectory Method System.IO.DirectoryInfo CreateSubdirectory(string path), System.IO.DirectoryInfo CreateSubdirectory(string path, System.Security.AccessControl.DirectorySecurity directorySecurity)
Delete Method System.Void Delete(), System.Void Delete(bool recursive)
Equals Method bool Equals(System.Object obj)
GetAccessControl Method System.Security.AccessControl.DirectorySecurity GetAccessControl(), System.Security.AccessControl.DirectorySecurity GetAccessControl(System.Security.AccessControl.AccessControlSections includeSections)
GetDirectories Method System.IO.DirectoryInfo[] GetDirectories(string searchPattern), System.IO.DirectoryInfo[] GetDirectories(), System.IO.DirectoryInfo[] GetDirectories(string searchPattern, System.IO.SearchOption searchOption)
GetFiles Method System.IO.FileInfo[] GetFiles(string searchPattern), System.IO.FileInfo[] GetFiles(string searchPattern, System.IO.SearchOption searchOption), System.IO.FileInfo[] GetFiles()
GetFileSystemInfos Method System.IO.FileSystemInfo[] GetFileSystemInfos(string searchPattern), System.IO.FileSystemInfo[] GetFileSystemInfos()
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetObjectData Method System.Void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
MoveTo Method System.Void MoveTo(string destDirName)
Refresh Method System.Void Refresh()
SetAccessControl Method System.Void SetAccessControl(System.Security.AccessControl.DirectorySecurity directorySecurity)
ToString Method string ToString()
PSChildName NoteProperty System.String PSChildName=FRgpoCo
PSDrive NoteProperty System.Management.Automation.PSDriveInfo PSDrive=C
PSIsContainer NoteProperty System.Boolean PSIsContainer=True
PSParentPath NoteProperty System.String PSParentPath=Microsoft.PowerShell.Core\FileSystem::C:\Temp
PSPath NoteProperty System.String PSPath=Microsoft.PowerShell.Core\FileSystem::C:\Temp\FRgpoCo
PSProvider NoteProperty System.Management.Automation.ProviderInfo PSProvider=Microsoft.PowerShell.Core\FileSystem
Attributes Property System.IO.FileAttributes Attributes {get;set;}
CreationTime Property System.DateTime CreationTime {get;set;}
CreationTimeUtc Property System.DateTime CreationTimeUtc {get;set;}
Exists Property System.Boolean Exists {get;}
Extension Property System.String Extension {get;}
FullName Property System.String FullName {get;}
LastAccessTime Property System.DateTime LastAccessTime {get;set;}
LastAccessTimeUtc Property System.DateTime LastAccessTimeUtc {get;set;}
LastWriteTime Property System.DateTime LastWriteTime {get;set;}
LastWriteTimeUtc Property System.DateTime LastWriteTimeUtc {get;set;}
Name Property System.String Name {get;}
Parent Property System.IO.DirectoryInfo Parent {get;}
Root Property System.IO.DirectoryInfo Root {get;}
BaseName ScriptProperty System.Object BaseName {get=$this.Name;}


Donc ici la propriété qui t'intéresse c'est Name. Si on combine avec le Foreach...

[code:1]
Foreach ( $Fichier in $Fichiers ) {
$Fichier.Name
}
[/code:1]

Ensuite, pour déplacer un objet en powershell on va utiliser la commande Move-Item .

Et pour tester le nom du répertoire qui commence par tel ou tel chaine de caractères il va falloir utiliser des regex là j'ai pas de lien powershell-scripting. Sinon, si les chaines ATX et APX sont uniquement présentes au début des fichiers, il est possible d'utiliser l'opérateur de comparaison \&quot;-contains\&quot;

En gros ça donne ça

[code:1]
Foreach ( $Fichier in $Fichiers ) {
if ( $Fichier.Name -contains \&quot;ATX\&quot; ) { Move-Item -Path $Fichier.FullName -Destination \&quot;D:\Rep1\\&quot; }
elseif ( $Fichier.Name -contains \&quot;APX\&quot; ) { Move-Item -Path $Fichier.FullName -Destination \&quot;D:\Rep2\\&quot; }
}
[/code:1]

Sinon tu peux faire beaucoup plus simple !

[code:1]
move-item -path C:\Temp\ATX*.txt -destination D:\Rep1
move-item -path C:\Temp\APX*.txt -destination D:\Rep2
[/code:1]

Voilà, bonne soirée !

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

Plus d'informations
il y a 13 ans 7 mois #12449 par dimitri
Bonjour,

Tout d'abord un grand merci pour cette expliquation vraiment très clair :P

La première solution, que je pense utiliser ne fonctionne pas. Un fichier commençant par \&quot;ATX\&quot; ne se déplace pas à l'endroit souhaité:

[code:1]
$Repertoire = \&quot;C:\test\&quot;
$Fichiers = Get-ChildItem $Repertoire

Foreach ( $Fichier in $Fichiers ) {
if ( $Fichier.Name -contains \&quot;atx\&quot; ) { Move-Item -Path $Fichier.FullName -Destination \&quot;C:\Rep1\\&quot; }
elseif ( $Fichier.Name -contains \&quot;APX\&quot; ) { Move-Item -Path $Fichier.FullName -Destination \&quot;C:\Rep2\\&quot; }
}
[/code:1]

As-tu une idée ? Sinon le deuxième code fonctionne parfaitement. ;)

Avec ton premier code j'aimerai tracer dans un fichier de logs se qui transite entre \&quot;C:\test\&quot; et mes deux autres répertoires de destination.

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

Plus d'informations
il y a 13 ans 7 mois #12450 par SiSMik
Salut,

As-tu des messages d'erreur ?

Cordialement,

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

Plus d'informations
il y a 13 ans 7 mois #12453 par dimitri
Hélas non, je n’ai aucuns messages d'erreurs lorsque j’exécute le script.

Juste le déplacement du fichier ne se fait pas :(

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

Plus d'informations
il y a 13 ans 7 mois #12454 par Laurent Dardenne
Salut,
l'opérateur -Contains n'est pas approprié :
[code:1]
$Repertoire = \&quot;C:\Temp\&quot;

cd $Repertoire
\&quot;test\&quot; &gt; \&quot;f1.atx\&quot;
\&quot;test\&quot; &gt; \&quot;f1atx.txt\&quot;
\&quot;test\&quot; &gt; \&quot;f2.atx\&quot;
\&quot;test\&quot; &gt; \&quot;f2atx.txt\&quot;

\&quot;test\&quot; &gt; \&quot;f1.apx\&quot;
\&quot;test\&quot; &gt; \&quot;f1apx.txt\&quot;
\&quot;test\&quot; &gt; \&quot;f2.apx\&quot;
\&quot;test\&quot; &gt; \&quot;f2apx.txt\&quot;

$Destination =\&quot;D:\Rep1\&quot;
$Destination =\&quot;G:\Temp\&quot;

Foreach ( $Fichier in Get-ChildItem $Repertoire )
{
if ( $Fichier.Name -match \&quot;ATX\&quot; ) { Move-Item -Path $Fichier.FullName -Destination $Destination -whatif}
elseif ( $Fichier.Name -match \&quot;APX\&quot; ) { Move-Item -Path $Fichier.FullName -Destination $Destination -whatif }
}
[/code:1]

Tutoriels PowerShell

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

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