2009-12-14 1 views
4

Je suis un débutant de PowerShell, et j'aimerais pouvoir écrire ceci. J'ai un fichier texte où chaque ligne fait partie d'un nom de fichier sans le chemin ou l'extension. Je voudrais un one-liner qui boucle à travers chaque ligne du fichier (avec un gc - Get-Content, droit?), Prend le contenu de la ligne, construit le chemin source (le lecteur réseau et l'extension sont statiques), construit un chemin de destination, puis copie chaque fichier. Mon contenu du fichier est comme ceci:PowerShell: lit les lignes à partir du fichier texte, construit les noms des fichiers sources et de destination, puis copie les fichiers

12345678 
98765432 
32145698 
12365782 

Et mon dossier source est un chemin UNC comme ceci:

\\server\share 

Et mon dossier de destination est:

c:\temp\files 

Je voudrais faire l'équivalent de cette commande DOS, en utilisant $_ comme le texte de chaque ligne du fichier:

copy \\server\share\$_.ext c:\temp\files\$_.ext 

Je suis sûr que je peux utiliser gc et $_ pour accéder à chaque ligne du fichier, et que je dois utiliser cp pour copier les fichiers, mais je ne parviens pas à construire les noms de fichiers source et de destination.

Répondre

5

Effectuez les opérations suivantes

gc theFileName | 
    %{ "{0}.ext" -f $_ } | 
    %{ copy "\\server\share\$_" "c:\temp\files\$_" } 

Il peut effectivement être fait sur une seule ligne, mais il semble mieux formmated que plusieurs lignes pour cette réponse :)

+0

Excellent. Merci beaucoup! @JaredPar, mon coach personnel Powershell. –

+1

quelque chose ne va pas avec 'gc theFileName | % {cp '\\ serveur \ partage \ $ _. ext' 'C: \ temp \ fichiers'} '? Ou serait-ce court? :-) – Joey

+0

@Johannes, je * pense * que cela fonctionnera mais j'oublie les règles d'analyse sur le remplacement au sein d'une chaîne de temps en temps et je ne savais pas si le .ext serait interprété correctement. D'où la route sûre – JaredPar

4

Copy-Item peut prendre un bloc de script directement dans ce cas si les étapes ForEach-Object ne sont pas nécessaires:

gc theFileName | cpi -l {"\\server\share\$_.exe"} c:\temp\files -whatif 

Supprimez le paramètre -WhatIf une fois que vous êtes satisfait cela fonctionne. Le -l est l'abréviation de -LiteralPath qui aide PowerShell à déterminer quel jeu de paramètres est utilisé. Il est également préférable d'utiliser ici le chemin littéral afin que les caractères génériques ne soient pas globalisés (sauf si vous le souhaitez - si c'est le cas, utilisez -path).

Pour l'essentiel, les paramètres liés au pipeline peuvent être spécifiés via des scriptsblocs et PowerShell tente de résoudre le résultat du scriptblock au type attendu par le paramètre lié au pipeline.

+0

Est-ce vrai en général ou une fonctionnalité intéressante de Copy-Item? –

+1

Cela fonctionne pour tout paramètre qui est également lié au pipeline. Le paramètre/analyseur de paramètre PowerShell évalera le bloc de script pour les paramètres liés au pipeline, à moins, bien sûr, que le type de paramètre ne soit [scriptblock]. –

+0

En effet, cela fonctionne même sur les paramètres de ValueFromPipelineByPropertyName - awesome! –

Questions connexes