TimeStamp sur le nom de fichier à l'aide de PowerShell

95

J'ai un chemin dans une chaîne,

"C:\temp\mybackup.zip"

Je voudrais insérer un horodatage dans ce script, par exemple,

"C:\temp\mybackup 2009-12-23.zip"

Existe-t-il un moyen simple de le faire dans PowerShell?

Chris Jones
la source

Réponses:

196

Vous pouvez insérer du code de script PowerShell arbitraire dans une chaîne entre guillemets en utilisant une sous-expression, par exemple, $ () comme ceci:

"C:\temp\mybackup $(get-date -f yyyy-MM-dd).zip"

Et si vous obtenez le chemin ailleurs - déjà sous forme de chaîne:

$dirName  = [io.path]::GetDirectoryName($path)
$filename = [io.path]::GetFileNameWithoutExtension($path)
$ext      = [io.path]::GetExtension($path)
$newPath  = "$dirName\$filename $(get-date -f yyyy-MM-dd)$ext"

Et si le chemin provient de la sortie de Get-ChildItem :

Get-ChildItem *.zip | Foreach {
  "$($_.DirectoryName)\$($_.BaseName) $(get-date -f yyyy-MM-dd)$($_.extension)"}
Keith Hill
la source
5
Argh. get-date -f yyyy-MM-ddm'a fait m'arrêter un instant avant de réaliser que ce n'est pas l' -f opérateur mais la forme abrégée du -Format paramètre . Cela avait l'air plutôt hors de propos, d'une manière ou d'une autre :-)
Joey
Merci Keith qui a été d'une grande aide
Chris Jones
1
et si je veux aussi le temps?
John Demetriou
16

Voici un code PowerShell qui devrait fonctionner. Vous pouvez combiner la plupart de cela en moins de lignes, mais je voulais que ce soit clair et lisible.

[string]$filePath = "C:\tempFile.zip";

[string]$directory = [System.IO.Path]::GetDirectoryName($filePath);
[string]$strippedFileName = [System.IO.Path]::GetFileNameWithoutExtension($filePath);
[string]$extension = [System.IO.Path]::GetExtension($filePath);
[string]$newFileName = $strippedFileName + [DateTime]::Now.ToString("yyyyMMdd-HHmmss") + $extension;
[string]$newFilePath = [System.IO.Path]::Combine($directory, $newFileName);

Move-Item -LiteralPath $filePath -Destination $newFilePath;
Tom Hazel
la source
Merci Tom, c'était aussi une grande aide
Chris Jones
12

J'avais besoin d'exporter notre journal de sécurité et je voulais la date et l'heure en temps universel coordonné. Cela s'est avéré être un défi à comprendre, mais si simple à exécuter:

wevtutil export-log security c:\users\%username%\SECURITYEVENTLOG-%computername%-$(((get-date).ToUniversalTime()).ToString("yyyyMMddTHHmmssZ")).evtx

Le code magique est juste cette partie:

$(((get-date).ToUniversalTime()).ToString("yyyyMMddTHHmmssZ"))
Ryker Abel
la source
hhest de 12 heures, sans ttce n'est pas utile. L'utilisation HHvous donnera 24 heures. Je recommanderais l'un hhmmssttou l' autre ouHHmmss
Josh Brown
@JoshBrown J'ai changé hhpour HHci-dessus. Je pense que c'est ce que la plupart des gens voudront.
mwfearnley le
4

Merci pour le script ci-dessus. Une petite modification à ajouter dans le fichier se terminant correctement. Essaye ça ...

$filenameFormat = "MyFileName" + " " + (Get-Date -Format "yyyy-MM-dd") **+ ".txt"**

Rename-Item -Path "C:\temp\MyFileName.txt" -NewName $filenameFormat
Robert Blackwell
la source
2

Utilisation:

$filenameFormat = "mybackup.zip" + " " + (Get-Date -Format "yyyy-MM-dd")
Rename-Item -Path "C:\temp\mybackup.zip" -NewName $filenameFormat
Will Webb
la source
peut-être $filenameFormat = "mybackup $(Get-Date -Format "yyyy-MM-dd").zip" puisque cela correspond au format OP
Mark Schultheiss