2017-07-26 2 views
2

J'essaie de m'instruire suffisamment de powerhell ou de programmation par lots pour réaliser ce qui suit (j'ai fait une recherche et regardé quelques heures de tutoriels Youtube mais je peux Je ne comprends pas ce que j'ai besoin - par exemple, je ne reçois pas de jetons, mais ils semblent nécessaires dans la boucle For). En outre, je ne sais pas si le meilleur résultat est obtenu par robocopy ou xcopy.Copier des fichiers définis dans une liste à partir de l'emplacement réseau

Tâche:

Définition d'une liste de fichiers à récupérer dans un fichier CSV (nom de fichier sera répertorié comme un numéro à 13 chiffres, l'extension sera UNKNOWN, mais sera généralement .jpg, mais peut parfois être .png - cela pourrait être atteint avec un caractère générique)

liste

lirait quelque chose comme:

9780761189931 
9780761189988 
9781579657159 

Pour chaque ligne dans ce fichier texte, faites:

Recherche un dossier réseau et tous les sous-dossiers

Si le nom de fichier exact se trouve, copie à une cible arbitraire (par exemple un nouveau dossier créé sur le bureau)

(pas 100% nécessaire, mais agréable d'avoir) Une fois La boucle For est terminée, affiche une liste de fichiers copiés dans un fichier texte dans le nouveau dossier de destination.

Je suppose que je vais devoir faire quelques choses en premier, comme définir des variables pour la source et la destination Dossiers? J'ai trouvé le ci-dessous ailleurs mais je n'arrivais pas à comprendre.

set src_folder=O:\2017\By_Month\Covers 
set dst_folder=c:\Users\%USERNAME&\Desktop\GetCovers 
for /f "tokens=*" %%i in (ISBN.txt) DO (
    xcopy /K "%src_folder%\%%i" "%dst_folder%" 
) 

Merci d'avance!

Répondre

0

D'ailleurs, cette solution est en PowerShell.

Pour obtenir tous les sous-fichiers d'un dossier, utilisez Get-ChildItem et le pipeline, et vous pouvez alors comparer le nom à l'intérieur de votre CSV (que vous pouvez obtenir en utilisant import-CSV, par la voie).

Get-ChildItem -path $src_folder -recurse | foreach{$_.fullname} 

personnellement je l'utilise alors une fonction pour modifier le nom comme une chaîne, mais je sais que c'est probablement pas la meilleure façon de le faire. Créer une fonction en dehors de la canalisation, et l'ont retourné un chemin modifié de telle sorte que vous pouvez continuer à la ligne précédente comme ceci:

Get-ChildItem -path $src_folder -recurse | foreach{$_.CopyTo (edit-path $_.fullname)} 

Où « modifier-répertoire » est votre fonction qui prend dans le chemin et le modifie pour renvoyer votre chemin de destination. En outre, vous pouvez également utiliser robocopy ou xcopy au lieu de CopyTo, mais Copy-Item est un natif PowerShell et ne nécessite pas beaucoup de manipulation de chaînes (ce qui dans mon expérience, le moins, le mieux).

Edit: Voici une fonction qui pourrait faire l'affaire:

function edit-path{ 
Param([string] $path) 
    $modified_path = $dst_folder + "\" 
    $modified_path = $path.substring($src_folder.length) 
    return $modified_path 
} 

Edit: Voici comment intégrer l'importation de CSV, de sorte que la copie ne se produit que des fichiers qui sont écrits dans le CSV (que je avait laissé de côté, oups):

$csv = import-csv $CSV_path 
Get-ChildItem -path $src_folder -recurse | where-object{$csv -contains $_.name} | foreach{$_.CopyTo (edit-path $_.fullname)} 

Notez que vous devez mettre tout le chemin CSV dans la variable CSV_path $, et selon la façon dont le contenu de ce fichier sont écrits, vous devrez peut-être utiliser $ _. fullname, ou d'autres paramètres.

0

Cela semble un problème assez moyenne:

$Arr = Import-CSV -Path $CSVPath 

Get-ChildItem -Path $Folder -Recurse | 
    Where-Object -FilterScript { $Arr -contains $PSItem.Name.Substring(0,($PSItem.Length - 4)) } | 
    ForEach-Object -Process { 
    Copy-Item -Destination $env:UserProfile\Desktop 
    $PSItem.Name | Out-File -FilePath $env:UserProfile\Desktop\Results.txt -Append 
    } 

Je ne suis pas très bien avec la manipulation de chaînes si le bit de chaîne est un peu déroutant, mais voici tout énoncé.