Отметка времени для имени файла с помощью PowerShell

96

У меня есть путь в строке,

"C:\temp\mybackup.zip"

Я хотел бы вставить в этот скрипт отметку времени, например,

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

Есть ли простой способ сделать это в PowerShell?

Крис Джонс
источник

Ответы:

201

Вы можете вставить произвольный код скрипта PowerShell в строку с двойными кавычками, используя подвыражение, например $ (), например:

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

И если вы получаете путь откуда-то еще - уже в виде строки:

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

И если путь происходит из вывода Get-ChildItem :

Get-ChildItem *.zip | Foreach {
  "$($_.DirectoryName)\$($_.BaseName) $(get-date -f yyyy-MM-dd)$($_.extension)"}
Кейт Хилл
источник
6
Ага. get-date -f yyyy-MM-ddзаставил меня остановиться на мгновение , прежде чем понял , что это не -f оператор , а сокращенная форма для -Format параметра . Это выглядело как-то не к месту :-)
Joey
Спасибо, Кейт, это здорово помогло
Крис Джонс
1
и если мне тоже нужно время?
Джон Деметриу
1
@JohnDemetri, см. Msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
Кейт Хилл,
17

Вот код PowerShell, который должен работать. Вы можете объединить большую часть этого в меньшее количество строк, но я хотел, чтобы это было понятно и читаемо.

[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;
Том Хейзел
источник
Спасибо, Том, это тоже здорово помогло
Крис Джонс
13

Мне нужно было экспортировать наш журнал безопасности, и мне нужна была дата и время в формате всемирного координированного времени. Разобраться в этом оказалось непросто, но так просто выполнить:

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

Магический код - это как раз эта часть:

$(((get-date).ToUniversalTime()).ToString("yyyyMMddTHHmmssZ"))
Райкер Абель
источник
hhэто 12-часовое время, без ttнего бесполезно. Использование HHдаст вам 24-часовое время. Я бы порекомендовал либо, hhmmssttлибоHHmmss
Джош Браун
@JoshBrown Я изменил hhна HHвыше. Я думаю, это то, чего захочет большинство людей.
mwfearnley,
4

Спасибо за приведенный выше сценарий. Одна небольшая модификация, чтобы добавить в файл, заканчивающийся правильно. Попробуй это ...

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

Rename-Item -Path "C:\temp\MyFileName.txt" -NewName $filenameFormat
Роберт Блэквелл
источник
2

Использование:

$filenameFormat = "mybackup.zip" + " " + (Get-Date -Format "yyyy-MM-dd")
Rename-Item -Path "C:\temp\mybackup.zip" -NewName $filenameFormat
Уилл Уэбб
источник
возможно, $filenameFormat = "mybackup $(Get-Date -Format "yyyy-MM-dd").zip" поскольку это соответствует формату OP
Mark Schultheiss