Как создать пустой журнал или текстовый файл с помощью Powershell, используя дату или временную метку?

Как создать пустой файл с помощью powershell, аналогичный «touch» в Linux, с отметкой времени в имени файла?

не слишком отличается от:

md5sum /etc/mtab > "$(date +"%Y_%m_%d_%I_%M_%p").log"

хотя этот файл на самом деле не пустой, но в самом имени файла есть дата.

Попытки на Powershell:

PS /home/nicholas/powershell/file_ops> New-Item -ItemType file  foo.txt

New-Item: The file '/home/nicholas/powershell/file_ops/foo.txt' already exists.

New-Item: The file '/home/nicholas/powershell/file_ops/foo.txt' already exists.
PS /home/nicholas/powershell/file_ops> New-Item -ItemType file  bar.txt

    Directory: /home/nicholas/powershell/file_ops

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-----          12/20/2020 10:56 AM              0 bar.txt

PS /home/nicholas/powershell/file_ops> $logfile = "./"+$FN+"-LOG-AddUser_$(get-date -Format yyyymmdd_hhmmtt).txt"

в идеале для создания произвольного количества пустых журналов или текстовых файлов.

смотрите также:

https://community.spiceworks.com/topic/1194231-powershell-adding-a-variable-into-a-log-filename

https://superuser.com/q/502374/977796

https://4sysops.com/archives/understanding-the-powershell-_-and-psitem-pipeline-variables/

https://unix.stackexchange.com/q/278939/101935

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 012
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В простейшем случае, если вы хотите безоговорочно создать файл, используйте New-Item -Force, но обратите внимание, что если целевой файл существует, его содержимое отбрасывается:

# CAVEAT: Truncates an existing file. `-ItemType File` is implied.
#  * Outputs a [System.IO.FileInfo] instance describing the new file, which
# $null = ... discards here.
#  * `Get-Date -UFormat` allows you to perform Unix-style date formatting.
$null = New-Item -Force "$(Get-Date -UFormat "%Y_%m_%d_%I_%M_%p").log"
  • Параметр New-Item (позиционно подразумеваемый) -Path поддерживает массив путей, поэтому вы можете пройти несколько путей одновременно.

  • По умолчанию создается пустой файл, но вы можете дополнительно указать (начальный) контент с помощью параметра -Value.


Требуется дополнительная работа, если вы действительно хотите эмулировать поведение утилиты touch Unix, что по умолчанию означает (обратите внимание, что touch поддерживает множество вариантов[1]):

  • Если файл еще не существует, создайте его (как пустой файл).
  • В противном случае обновите метку времени последнего изменения до текущего момента времени (и оставьте существующий контент в покое).
$file = "$(Get-Date -UFormat "%Y_%m_%d_%I_%M_%p").log"
# Trick: This dummy operation leaves an existing file alone,
#        but creates the file if it doesn't exist.
Add-Content -LiteralPath $file -Value $null
(Get-Item -LiteralPath $file).LastWriteTime = Get-Date

Примечание:

  • Вышеприведенное ограничено одним файлом, указанным литеральным путем, и не включает обработку ошибок.

  • См. этот ответ для пользовательской функции PowerShell Touch-File, которая реализует большую часть функциональности утилиты touch в идиоматическом стиле PowerShell, включая возможность правильной обработки шаблонов подстановочных знаков.

    • Указанная функция также доступна как Gist с лицензией MIT. Предполагая, что вы просмотрели связанный код, чтобы убедиться, что он безопасен (в чем я могу вас лично заверить, но вы всегда должны проверять), вы можете установить его напрямую следующим образом:

      irm https://gist.github.com/mklement0/82ed8e73bb1d17c5ff7b57d958db2872/raw/Touch-File.ps1 | iex
      

[1] The linked page is touch's POSIX spec, which mandates minimum functionality; concrete implementations may support more.

Другие вопросы по теме