Добавить вычисляемое поле в импортированный CSV на основе даты и времени - PullRequest
0 голосов
/ 03 апреля 2020

Может ли кто-нибудь помочь с этим. Мой текущий код импортирует CSV-файл, который имеет три столбца, поэтому он будет обновлять имена столбцов, чтобы сделать их более читаемыми. Мне нужно добавить четвертый столбец, который является вычисляемым полем на основе поля даты и времени. Поэтому необходимо проверить поле даты и времени, а затем отобразить количество дней до того, как ему исполнилось 90 дней. например, «Сегодняшняя дата» - «03/03/2020 8:00:00 AM» = 31 день 90 дней - 31 день = 59 дней (59 дней - go в столбце вычисляемого поля Бит новичка с powershell и все остальные функции работают, но это то, что у меня осталось, и мне нужно добавить его в вызов ниже, когда импортируется CSV, столбцы заголовков обновляются, а затем экспортируются в новый файл.

$input = "C:\Data\test\unchanged101.csv"
$output = "C:\Data\test\unchanged101conv.csv"

$checkDate = (Get-Date).AddDays(-90)
$data = Import-Csv $input |
    Where-Object {
        ($_."pwdlastset" -as [DateTime]) -lt $CheckDate
    }

$headerConversion = @(
    @{ Name = 'User account';   Expression = { $_.'cn'  } }
    @{ Name = 'Last modified date'; Expression = { $_.'pwdlastset' } }
    @{ Name = 'Email address';   Expression = { $_.'mail'  } }
)

(Import-Csv -Path $input) |
Select-Object -Property $headerConversion | Select-Object *,"Days Left" |
Export-Csv -Path $output -NoTypeInformation

Новый столбец - «Оставшиеся дни», в котором мне нужно отобразить количество дней, оставшихся до 90 дней. Как получить результат из кода, приведенного здесь, в этот столбец для каждой строки?

$checkDate = (Get-Date).AddDays(-90)
$data = Import-Csv $input |
    Where-Object {
        ($_."pwdlastset" -as [DateTime]) -lt $CheckDate
    }

Работаю над этим последние несколько дней и просто не могу понять последнюю часть.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Прежде всего, вы не должны использовать имя переменной $input, так как это Автомат c переменная

Если вы вычтете один объект datetime из другого, результатом будет TimeSpan объект, который имеет свойство с именем Days, которое вы можете использовать

$inputFile  = "C:\Data\test\unchanged101.csv"
$outputFile = "C:\Data\test\unchanged101conv.csv"

$checkDate = (Get-Date).AddDays(-90).Date  # .Date sets this to midnight
$result = Import-Csv $inputFile |
            Where-Object { [DateTime]$_.pwdlastset -lt $CheckDate } |
            Select-Object @{ Name = 'User account'; Expression = { $_.cn  } },
                          @{ Name = 'Last modified date'; Expression = { $_.pwdlastset } },
                          @{ Name = 'Email address'; Expression = { $_.mail  } },
                          @{ Name = 'Days Left'; Expression = { ($checkDate - [DateTime]$_.pwdlastset).Days } }

# output on screen
$result | Format-Table -AutoSize

# output to csv
$result | Export-Csv -Path $outputFile -NoTypeInformation
0 голосов
/ 03 апреля 2020

Я бы сначала добавил новый столбец, а затем go через все строки (с foreach l oop) проверил оставшиеся дни и записал их в новый столбец «Осталось дней».

Примечание: я пропустил конвертацию вашего заголовка здесь. Сначала нужно запустить его, а затем код «Осталось дней» ...

$data = Import-Csv $input #import everything

foreach($line in $data){
    $daysLeft = 0
    $daysSinceLastSet = ((Get-Date) - [DateTime]$line.pwdlastset).Days
    if ($daysSinceLastSet -lt 90){
        $daysLeft = 90-$daysSinceLastSet
    }

    $line."Days Left" = $daysLeft
}

$data | Export-Csv -Path $output -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...