0
votes

Comment renommer un grand nombre de fichiers à l'aide de PowerShell et d'un CSV

En fin de compte, j'ai besoin d'un script Solid PowerShell qui prendra un dossier avec plusieurs centaines de fichiers vidéo, importez les noms de fichiers existants dans le programme, consultez le nouveau nom de fichier dans un CSV et renommez-le. L'ancien nom de fichier est simplement (c.-à-d. Fichier1.mp4, fichier2.mp4, etc.) J'aimerais ajouter une date à l'avant du fichier au format de (AAAA-MM-DD).

pour tester, J'ai créé un dossier sur mon bureau avec (10) fichiers texte, chacun avec un nom de fichier unique.

Mon fichier CSV apparaît comme suit:

Image de CSV

La colonne" NewFileName ", a été créée à l'aide de la commande de concaténate dans Excel. xxx

autant que je voudrais juste que PowerShell de gérer tout, je me sens en utilisant Excel pour la majeure partie de cela pourrait être la meilleure façon.

dans mon Test, tout était dans un dossier. Cependant, au travail, je disposerai de fichiers vidéo sur un lecteur et que le script devra être dans un dossier sur mon bureau. Parce que je suis dans un réseau d'entreprise, j'ai besoin d'un fichier de commandes spécial pour exécuter mes scripts, ce qui n'est rien de nouveau. Je viens de modifier le nom du script, et tout va bien!

Alors, quelles commandes dois-je faire pour que le script soit séparé des fichiers vidéo et du fichier CSV?

Voici le code que j'ai jusqu'à présent. Tout fonctionne quand c'est dans un dossier. xxx

merci d'avance pour l'aide!

chris


3 commentaires

Pouvez-vous reformuler la déclaration suivante, je ne suis pas sûr de ce que vous entendez par cela: "Alors, quelles commandes dois-je faire pour que le script soit séparé des fichiers vidéo et du fichier CSV?"


Je conviens que cela devrait être reformulé pour plus de clarté. Je pense qu'ils veulent simplement demander comment faire référence à des choses dans le répertoire actuel. @Chris, il vous suffit d'utiliser des chemins complets vers les fichiers (script, vidéos, csv). Aucune commande spéciale n'est nécessaire sauf si je suis mal compris ce que vous demandez là-bas.


Désolé d'être incertain. Oui, je demandais simplement à quelles commandes dois-je ajouter au script pour que je puisse exécuter le script à partir d'un dossier, séparé des fichiers réels que je dois renommer.


3 Réponses :


0
votes
$targetdir="C:\path\to\where\our\file\directory\is"
$pathtocsv="c:\path\to\csv.csv"

Import-Csv -Path $pathtocsv | ForEach-Object {
    $Src = Join-Path -Path $TargetDir -ChildPath $_.filename
    $Dst = Join-Path -Path $TargetDir -ChildPath $_.newfilename
    Rename-Item -Path $Src -NewName $Dst
} 
Why would this not work in any situation?

1 commentaires

OP, votre cas d'utilisation est-il suffisamment étroit que les chemins codés durs correspondent au besoin ou justifient-il un script paramétré à l'aide de fonctions avancées ou d'importations de module?



0
votes

Je ne sais pas quelle est la colonne Date dans votre fichier Excel et si vous souhaitez renommer tous les fichiers du dossier, mais si tel est le cas, vous n'avez pas besoin de fichier CSV et que vous pouvez le faire. :

$sourceFolder = 'X:\Path\to\the\video\files'                 # change this to the real path
Get-ChildItem -Path $sourceFolder -Filter '*.mp4' -File |    # iterate through the files in the folder
    Where-Object {$_.Name -notmatch '^\d{4}-\d{2}-\d{2}'} |  # don't rename files that already start with the date
    Rename-Item -NewName { '{0:yyyy-MM-dd} {1}' -f $_.LastWriteTime, $_.Name } -WhatIf


7 commentaires

La colonne Date est ce que j'ai utilisé pour concaténer à ce qui deviendrait le nouveau nom de fichier. Je sais que vous avez dit que je n'aurais pas besoin du fichier CSV, mais je pense que j'en ai encore besoin, sauf si je manque quelque chose de tout à fait. J'ai juste ajouté des doubles citations au chemin source. Comment a-t-il tiré la date réelle que le fichier a été publié? Il correspond parfaitement au fichier CSV que j'ai créé. Les dates de sortie sont-elles en quelque sorte liées aux métadonnées de chaque fichier?


@Chrisranes Oui, le Get-Childitem collecte des objets FileInfo (dans ce cas en raison du commutateur -FILE Il n'y aura pas d'objet DIAMPERIFO). Ces objets contiennent beaucoup d'informations sur chaque fichier, y compris le LastwriteTime. Ceci est la dernière date modifiée que vous voyez dans Explorer. Donc, cette date est déjà présente et vous n'avez pas besoin de créer un fichier CSV «entre-intermédiaire» pour cela.


Wow! Merci beaucoup. Cela sera définitivement utile d'aller de l'avant. S'il y avait une raison pour laquelle j'avais besoin d'utiliser un CSV, dites-vous si la "dernière date modifiée" n'était pas incluse pour une raison quelconque, comment modifieriez-vous votre script pour pouvoir renommer les fichiers?


@Chrisranes La date de la quartwritetime est toujours présente. Lookup FileInfo pour voir toutes les propriétés disponibles. Si vous sentez que ma réponse a résolu votre problème, je vous serais reconnaissant si vous l'acceptez en cliquant sur l'icône de coche à côté.


Aurais-je besoin de modifier l'une de ces commandes pour exécuter sur PowerShell 2.0? Le script comme écrit fonctionne bien avec le PS intégré à Windows 10. Cependant, au travail, sous Windows 7, et en exécutant le fichier de commandes suivant pour obtenir le script à exécuter, je reçois l'erreur suivante.


Fichier de commandes: PowerShell.exe -noexit -nologo -ExecuePolyPasse de bypassePolicale -Noprofile -File Rename.Ps1 Erreur: Get-ChildItem: Un paramètre est introuvable qui correspond au nom de paramètre 'Fichier'. À C: \ Users \ Cranes \ Desktop \ PowerShell scripts \ Rename.ps1: 2 Char: 56 + Get-Childitem -Path $ SourceFolder -Filter '* .mp4' -File <<<< | # Itérer via les fichiers dans le dossier + CatégorieInfo: InvalidApport: (:) [Get-ChildItem], ParameterBindingException + PullalifiedErrorId: NamedParameTernotFound, Microsoft.Powershell.comMands.getchil DitemCommand


@ChrisRanes Oui, sur PS <3.0, le commutateur -file n'existe pas. Pour cela, vous devez supprimer -file et modifier le où-objet sur où-objet {! $ _. Nom -NotMatch '^ \ d {4} - \ d {2} - \ d {2}'} . Cela fonctionne également dans des versions supérieures de Powershell, mais est plus inefficace. Si possible met à jour PowerShell, car v2 est vraiment vieux ..



0
votes

Au fait, si le CSV avait le chemin de colonnes et le nouveauame, il pourrait être de la pipi directement à Rename-item: xxx


0 commentaires