2017-07-24 4 views
1

J'essaie de copier des fichiers d'un dossier source vers un dossier de destination. Je voudrais seulement copier les fichiers qui ont été modifiés au cours des 20 dernières minutes. Pendant que je copie, je voudrais aussi ajouter la date et l'heure à la fin du nom de fichier. Le script que j'ai actuellement est:Copier et renommer des fichiers modifiés au dernier jour à l'aide de Powershell

$DestinationFolder = "C:\Output\" 
$timespan = new-timespan -minutes 20 
$Files = Get-ChildItem "C:\Input\*" -File 
foreach ($File in $Files) { 
    if ($File.LastWriteTime -gt $timespan) 
    { 
     Copy-Item -Path $_.FullName -Destination $DestinationFolder$($_.BaseName)_$ ($_.LastWriteTime.ToString('yyyyMMdd_hhmmss'))$($_.Extension) 
    } 
} 

Je reçois des messages d'erreur dans powershell lorsque je tente de tester mon scipt:

Impossible de comparer « 21/07/2017 07:31:01 » à " 00:20:00 ". Erreur: "Impossible de convertir la valeur" 00:20:00 "du type " System.TimeSpan "pour taper" System.DateTime "." À la ligne: 2 car: 9 + if ($ File.LastWriteTime $ -gt timespan) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~ + CategoryInfo: InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: ComparisonFailure

+1

Quelles sont les erreurs que vous obtenez? Les messages d'erreur dans PowerShell sont *** généralement *** assez instructifs, à la fois sur ce qui ne va pas et sur ce qui ne va pas. Si vous incluez les messages d'erreur dans votre question, il sera plus facile de vous aider. –

Répondre

5

Vous comparez un DateTime avec un TimeSpan. Cela n'a pas de sens. Un datetime est un point dans le temps. Un laps de temps est une durée. Vous devez comparer deux dates.

Essayez:

$DestinationFolder = "C:\Output\" 
$Cutoff = (Get-Date).AddMinutes(-20) 
Get-ChildItem "C:\Input\*" -File | Where-Object { 
    $_.LastWriteTime -gt $Cutoff 
} | ForEach-Object { 
    $DestinationFileName = '{0}_{1:yyyyMMdd_HHmmss}{2}' -f $_.BaseName, $_.LastWriteTime, $_.Extension 
    $DestinationFullFileName = Join-Path -Path $DestinationFolder -ChildPath $DestinationFileName 
    Copy-Item -Path $_.FullName -Destination $DestinationFullFileName 
} 

Je ne peux pas dire s'il y a un bogue dans votre ligne Copy-Item ou non. Vous pouvez vouloir un signe de dollar et un espace dedans là avant la date, mais je devine que ce n'est pas juste.

+0

@ user6391187 J'ai également corrigé le format datetime pour utiliser le format 24 heures ('HH'). Votre format actuel n'utilise que 12 heures ('hh'), ce qui peut prêter à confusion. –

3

Selon l'erreur que vous avez collé Powershell est d'avoir du mal à convertir un System.TimeSpan au System.DateTime type. Ce sont deux objets différents et vous devrez en jeter un dans l'autre avant de travailler ensemble.