Powershell - изменение метаданных из свойств файла на основе имени файла - PullRequest
0 голосов
/ 06 февраля 2020

Хорошо, вот мой вопрос:

У меня есть файл с таким именем: IMG_20191215_201811.jpg

Я хочу взять часть 201811, которая представляет час, и поместите его в дату создания метаданных файла. Может быть, все с датой со всеми 20191215_201811.

Каков наилучший способ сделать это?

## Q:\Test\2019\05\19\SO_56211626.ps1
$Directory = "C:\TestFolder"

foreach ($file in (Get-ChildItem -Path $Directory -Filter *.pdf)){
    if($File.BaseName -match '_(\d{4}-\d{2}-\d{2})(_\d)?$'){
        $date_from_file= (Get-Date $Matches[1])

        $file.CreationTime   = $date_from_file
        $file.LastAccessTime = $date_from_file
        $file.LastWriteTime  = $date_from_file
        $file | Select-Object Name,CreationTime,LastAccessTime,LastWriteTime
    }
}

Или, может быть, это?

$Directory = $env:TEMP
$DateFormat = "yyyy-MM-dd"

# create some test files
$TestFileList = @(
    'FileA_2017-10-15.pdf'
    'FileB_2016-04-08.pdf'
    'FileC_2018-01-30.pdf'
    'FileD_2019-09-09_1.pdf'
    'FileE_2015-05-05_2.pdf'
    )
foreach ($TFL_Item in $TestFileList)
    {
    $Null = New-Item -Path $Directory -Name $TFL_Item -ItemType File -Force
    }

$FileList = Get-ChildItem -LiteralPath $Directory -Filter '*.pdf' -File
foreach ($FL_Item in $FileList) {

    # removed split, added regex match to work with ever-growing list of variant file names
    $Null = $FL_Item.BaseName -match '_(?<DateString>\d{4}-\d{2}-\d{2})'
    $DateString = $Matches.DateString
    $date_from_file = [datetime]::ParseExact($DateString, $DateFormat, $Null)

    $FL_Item.CreationTime = $date_from_file
    $FL_Item.LastWriteTime = $date_from_file
    $FL_Item.LastAccessTime = $date_from_file

    # show the resulting datetime info
    '=' * 20
    $CurrentFileInfo = Get-Item -LiteralPath $FL_Item.FullName
    $CurrentFileInfo.FullName
    $CurrentFileInfo.CreationTime
    $CurrentFileInfo.LastWriteTime
    $CurrentFileInfo.LastAccessTime
    }

PS: я новичок ie в этом, так что не прыгайте на меня, потому что я даже не знаю, что к чему, и такие вещи очень тяжелы для моего мозга, иначе .... я бы не спросил вас, ребята:)

Спасибо, Богдан

PS2: Слава JadonR

1 Ответ

0 голосов
/ 06 февраля 2020

Я обнаружил, что мне нужно постоянно обновлять метаданные файла / даты, поэтому я поместил свое решение в функцию:

Function SingleItemCopyAttributes
{
    [cmdletbinding()]
    Param(
        [Parameter(Mandatory=$true,Position=0)]
        [string]$Source,

        [Parameter(Mandatory=$true,Position=1)]
        [string]$Dest,

        [Parameter(Mandatory=$false,Position=2)]
        [system.text.stringbuilder]$ErrorLog=$null
    )

    $S = Get-Item -LiteralPath $Source
    $D = Get-Item -LiteralPath $Dest

    Try
    {
        "CreationTime","LastWriteTime","LastAccessTime" | ForEach { $D.$_ = $S.$_ }
    }
    Catch
    {
        If ($ErrorLog -ne $null)
        {
            $ErrorLog.AppendLine("Error setting attributes for '$Dest' `$S.CreationTime=$($S.CreationTime) `$S.LastWriteTime=$($S.LastWriteTime) `$S.LastAccessTime=$($S.LastAccessTime)") | Out-Null
        }
        Write-Host "Error setting attributes for '$Dest'"
    }
}

РЕДАКТИРОВАТЬ: функция помещается в файл SingleItemCopyAttributes.ps1, который Я выполняю, чтобы загрузить его в память. Я также могу добавить эту функцию в начало моего скрипта, а затем вызвать ее ниже в l oop, где я сначала копирую элемент, а затем «копирую» атрибуты с помощью функции выше, например:

$SourceDir = #Define Source Dir here
$DestDir = #Define Dest Dir here
#Don't forget to create $DestDir if you need to with
#mkdir $DestDir
gci $SourceDir | % {
    $sf = $_.FullName
    $df = $_.FullName.Replace($SourceDir,$DestDir)
    copy-item $sf $df 
    SingleItemCopyAttributes $sf $df
}

Если вы хотите скопировать все файлы / папки рекурсивно

Надеюсь, это вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...