Znacznik czasu na nazwie pliku przy użyciu programu PowerShell

96

Mam ścieżkę w sznurku,

"C:\temp\mybackup.zip"

Chciałbym wstawić znacznik czasu do tego skryptu, na przykład

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

Czy istnieje łatwy sposób na zrobienie tego w PowerShell?

Chris Jones
źródło

Odpowiedzi:

200

Możesz wstawić dowolny kod skryptu programu PowerShell w ciągu znaków w podwójnych cudzysłowach, używając wyrażenia podrzędnego, na przykład $ () w następujący sposób:

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

A jeśli pobierasz ścieżkę z innego miejsca - już jako ciąg:

$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"

A jeśli ścieżka pochodzi z danych wyjściowych Get-ChildItem :

Get-ChildItem *.zip | Foreach {
  "$($_.DirectoryName)\$($_.BaseName) $(get-date -f yyyy-MM-dd)$($_.extension)"}
Keith Hill
źródło
6
Argh. get-date -f yyyy-MM-ddsprawiło, że zatrzymałem się na chwilę, zanim zdałem sobie sprawę, że to nie jest -f operator, ale krótka forma -Format parametru . Jakoś wyglądało to raczej nie na miejscu :-)
Joey
Dzięki Keith, to była wielka pomoc
Chris Jones,
1
a jeśli ja też chcę mieć czas?
John Demetriou,
17

Oto kod PowerShell, który powinien działać. Możesz połączyć większość tego w mniej wierszy, ale chciałem, aby było to jasne i czytelne.

[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
źródło
Dzięki Tom, to też była wielka pomoc
Chris Jones,
12

Musiałem wyeksportować nasz dziennik bezpieczeństwa i chciałem mieć datę i godzinę w uniwersalnym czasie koordynowanym. Okazało się to wyzwaniem, ale tak prostym do wykonania:

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

Magiczny kod to tylko ta część:

$(((get-date).ToUniversalTime()).ToString("yyyyMMddTHHmmssZ"))
Ryker Abel
źródło
hhto czas 12-godzinny, bez ttniego nie ma sensu. Korzystanie HHdaje 24-godzinny czas. Polecam albo hhmmssttalboHHmmss
Josh Brązowy
@JoshBrown Zmieniłem się hhnaHH powyżej. Myślę, że tego będzie chciała większość ludzi.
mwfearnley
4

Dzięki za powyższy scenariusz. Jedna mała modyfikacja, aby dodać poprawne zakończenie pliku. Spróbuj tego ...

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

Rename-Item -Path "C:\temp\MyFileName.txt" -NewName $filenameFormat
Robert Blackwell
źródło
2

Posługiwać się:

$filenameFormat = "mybackup.zip" + " " + (Get-Date -Format "yyyy-MM-dd")
Rename-Item -Path "C:\temp\mybackup.zip" -NewName $filenameFormat
Will Webb
źródło
być może $filenameFormat = "mybackup $(Get-Date -Format "yyyy-MM-dd").zip" dlatego, że pasuje do formatu OP
Mark Schultheiss.