Question Déplacer les fichiers avec leur arboresc. (Résolu)

Plus d'informations
il y a 16 ans 3 mois #1324 par big_cham
Bonjour tout le monde,

J'aimerai que vous m'apportiez vos lumières sur le script suivant.

J'ai un fichier qui contient une liste de chemins contenant des fichiers que j'aimerai déplacer dans une nouvelle arborescence. Je sais lire le fichier mais j'ai du mal à \"boucler\" avec l'option move.

Voilà le bout de script que j'essaye de faire marcher :
[code:1]
get_content D:\powershell\liste.txt | foreach {move-item -destination D:\powershell\move\}
[/code:1]
Voilà l'erreur que j'obtiens :

Le terme « get_content » n'est pas reconnu en tant qu'applet de commande, fonction, programme exécutable ou fichier de
script. Vérifiez le terme et réessayez.
Au niveau de D:\TAF\scripts\powershell\move.ps1 : 1 Caractère : 12
+ get_content <<<< D:\TAF\scripts\powershell\liste_exe.txt | foreach {move-item -destination D:\TAF\scripts\powershell
\move\}


Ci joint le fichier liste.txt. Pour ce fichier, je compte enlever le surplus de colonnes avec Excel. Il ne devrait contenir uniquement le chemin du fichier à déplacer.

Merci de m'aider :huh:

La pièce jointe liste.txt est absente ou indisponible



Message édité par: big_cham, à: 6/12/07 15:58<br><br>Message édité par: Arnaud, à: 19/12/07 23:15
Pièces jointes :

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

Plus d'informations
il y a 16 ans 3 mois #1328 par big_cham
Bon j'ai finalement trouvé quelque chose qui fonctionne :

[code:1]foreach ($i in get-content D:\TAF\scripts\powershell\liste_exe.txt)
{move-item -path $i -destination D:\TAF\scripts\powershell\move\}
[/code:1]
Je viens de me rendre compte de l'erreur get-content ! :whistle:

Dernière question, savez vous comment garder l'arborescence d'origine ?<br><br>Message édité par: big_cham, à: 6/12/07 15:59

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

Plus d'informations
il y a 16 ans 3 mois #1333 par Arnaud Petitjean
Bonjour Big_charm,

Pour que ton 1er bout de code fonctionne, il aurait fallu que tu écrives ceci :
[code:1]
get_content D:\powershell\liste.txt | foreach {move-item -path $_ -destination D:\powershell\move\}
[/code:1]

Le $_ te permet de récupérer la valeur courante à travers le pipe.

Sinon que veux tu dire par \&quot;garder l'arborescence d'origine ?\&quot;. Si tu ne souhaites pas déplacer les fichiers, peut-être que la copie serait plus appropriée ? Dans ce cas il faut que tu utilises la commande Copy-Item.

@++

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 16 ans 3 mois #1334 par big_cham
Merci pour l'info...

Quant à l'arborescence, voilà un exemple qui sera plus parlant :

[code:1]
d:\multimedia\rep1\xrep2\xxx.avi
d:\multimedia\rep1\xrep3\xxx.txt[/code:1]

Je voudrais copier les fichiers vers [code:1]D:\powershell\move\[/code:1] mais en gardant la structure des dossiers à savoir :

[code:1]
D:\powershell\move\multimedia\rep1\xrep2\xxx.avi
D:\powershell\move\multimedia\rep1\xrep2\xxx.avi[/code:1]

Est ce possible ?:dry:

Message édité par: big_cham, à: 7/12/07 08:42<br><br>Message édité par: Arnaud, à: 12/12/07 13:18

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

Plus d'informations
il y a 16 ans 3 mois #1335 par Jacques Barathon
Est-ce que robocopy ne te suffirait pas? Si tu ne connais pas, robocopy.exe est un outil du Resource Kit de Windows Server depuis très longtemps, téléchargeable gratuitement sur le site de MS. Une version de robocopy.exe est également fournie avec Vista.

Si tes besoins sont trop spécifiques pour être remplis par robocopy, il est tout à fait possible de faire ce que tu veux dans un script PowerShell, mais il faut que tu précises un peu comment tu comptes travailler. Il faut notamment que tu précises quelle partie du chemin d'origine doit être recréée dans l'arborescence de destination. Par exemple:

Fichier d'origine: \&quot;c:/documents and settings/toto/mes documents/mes comptes.xls\&quot;

Je veux le déplacer dans \&quot;d:/users/toto/mes documents\&quot;. Je dois donc indiquer à PowerShell que l'arborescence à reprendre est \&quot;/toto/mes documents\&quot;, car je ne veux pas que le script recrèe un dossier \&quot;/documents and settings\&quot; sous \&quot;d:/users\&quot;.

(NB: j'ai remplacé les backslashs par des slashs pour les garder à l'affichage)

La solution va dépendre des informations dont tu disposes sur le fichier d'origine (nom complet du fichier, nom relatif à un dossier racine, etc) et du fait ou non que la liste contient des fichiers venant de sources totalement différentes.

Dans l'exemple ci-dessus, je pourrais avoir l'information sous cette forme:

Fichier FICHIERS.CSV
[code:1]
Fichier,Racine
c:\documents and settings\toto\mes documents\mes comptes.xls,c:\documents and settings
[/code:1]

Tu noteras que l'information est au format CSV (champs séparés par des virgules), ce qui permettra une importation simplifiée sous PowerShell:

[code:1]
# répertoire racine de destination:
$destination = \&quot;d:\users\&quot;

# importation des informations sur les fichiers à copier:
$fichiers = @(import-csv fichiers.csv)

# parcours des fichiers un par un:
$fichiers | foreach {
# reconstruction du répertoire de destination:
$rep = split-path ($_.fichier -replace ($_.racine -replace \&quot;\\\&quot;,\&quot;\\\&quot;«»),$destination)
# création du répertoire s'il n'existe pas déjà:
if (!(test-path $rep)) { md $rep }
# déplacement du fichier dans son répertoire de destination:
move $_.fichier $rep
}[/code:1]
Je n'ai pas testé intégralement, mais ça devrait marcher.

Il ne s'agit ici que d'une solution possible, dans un contexte donné. A toi de voir si les informations dont tu disposes te permettent d'appliquer la même solution.

Janel<br><br>Message édité par: janel, à: 7/12/07 09:10

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

Plus d'informations
il y a 16 ans 3 mois #1336 par big_cham
Merci Janel. Je connais Robocopy pour l'avoir déjà utilisé dans Powershelle en plus...;)

En fouinant un peu, j'ai ce code là :

[code:1]foreach ($i in get-content D:\TAF\scripts\powershell\liste1.txt)
{
$item = Get-Item -LiteralPath $i
$destinationPath =
$item.DirectoryName.Replace(\&quot;$($item.PSDrive):\\&quot;,\&quot;D:\TAF\scripts\powershell\move\\&quot;«»)
if (-not $(Test-Path -LiteralPath $destinationPath))
{
New-Item -ItemType Directory -Path $destinationPath | Out-Null
}
$item | Move-Item -Destination $destinationPath
echo $destinationpath
}[/code:1]

Pour répondre à tes précédentes questions, je vais être plus précis.

J'ai un outil qui génère des rapports au format txt, facilement convertissables en CSV. Pour mon cas, j'ai modifié le contenu du fichier pour ne garder que le chemin du fichier. Première erreur apparemment, puisque le txt, n'est pas la solution idéale.

Une fois mon txt sous la main, je souhaite déplacer les fichiers vers un autre répertoire. Jusque là, pas de problème. Sauf que certains fichiers portent le même noms et la commande move-item les écraseraient. D'où la question de conserver l'arborscence...

Dans mon fichier je trouve d:/multimedia/rep1/xrep2/xxx.avi

Que je désire déplacer dans le répertoire D:/TAF/scripts/powershell/move/ mais en ajoutant /multimedia/rep1/xrep2/ dans lequel se trouve xxx.avi [/code:1]

Message édité par: big_cham, à: 7/12/07 09:23<br><br>Message édité par: big_cham, à: 7/12/07 09:24

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

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