Как создать пустой файл с помощью 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/
В простейшем случае, если вы хотите безоговорочно создать файл, используйте 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.