Как я могу добавить данные в powershell в другой файл, в зависимости от того, с какого месяца поступили данные? - PullRequest
0 голосов
/ 28 октября 2019

Я ежедневно получаю данные о внедрении продуктов Office 365. Я не знаю, как преобразовать мою текущую логику для записи в новый файл, основанный на размере файла, на файл, основанный на дате отчета.

Мой первоначальный мыслительный процесс состоял в том, чтобы использовать оператор if для разделения данных по месяцам и иметь 12 готовых файлов для добавления (в зависимости от месяца данных), но это кажется неэффективным.

$name = "O365SPSiteActivity.csv"
$auth=Get-AuthCode
$accesstoken=$auth[1]

### data pulling process has been omitted ###

if ($report -ne $null)
{
    ###New section for making the new files
    #Get current file
    $source = "D:\O365Data\"+ $name 
    $File = Get-Item $source

    If (((Get-Item $file).Length/1MB) -ge 700) 
    {
        $date = (get-date -Format dd-MM-yyyy)
        $RenamedFileName = "O365SPSiteActivity-$date.csv"
        Rename-Item $file.FullName -NewName $RenamedFileName
        $FileName = "D:\temp\" + $name
        Send-MailMessage –From svc_sps10@kbslp.com –To shelby.cundiff@kbslp.com –Subject “New File Has been Created" –Body “New File Name: $RenamedFileName "  -SmtpServer kbslp-com.mail.protection.outlook.com -Port 25


    }
    Else
    {
        $FileName = "D:\temp\" + $name
        Copy $File $FileName
    }


    #########################################################################
    $Data=@()
    $c=1
    foreach ($row in $report)
    {   Write-Progress -Activity $row.'User Principal Name' -PercentComplete (($c/$report.count)*100) -ID 4
        $string = "" | Select "???Report Refresh Date","User Principal Name","Is Deleted","Deleted Date","Last Activity Date","Viewed or Edited File Count",
                "Synced File Count","Shared Internally File Count","Shared Externally File Count","Visited Page Count","Report Period"
        $string.'???Report Refresh Date' = Get-Date($row.'Report Refresh Date') -Format "yyyy-MM-dd"
        $string.'User Principal Name' = $row.'User Principal Name'
        $string.'Is Deleted' = $row.'Is Deleted'
        $string.'Deleted Date' = $row.'Deleted Date'
        $string.'Last Activity Date' = $row.'Last Activity Date'
        $string.'Viewed or Edited File Count' = $row.'Viewed or Edited File Count'
        $string.'Synced File Count' = $row.'Synced File Count'
        $string.'Shared Internally File Count' = $row.'Shared Internally File Count'
        $string.'Shared Externally File Count' = $row.'Shared Externally File Count'
        $string.'Visited Page Count' = $row.'Visited Page Count'
        $string.'Report Period' = $row.'Report Period'
        $Data += $string
        $c++
    }
    $Data | Export-Csv -Append -Path $FileName -NoTypeInformation -Force
    #$FolderUrl = $teamSitePath + "/" + $ListName
    #$UploadFileInfo = New-Object System.IO.FileInfo($FileName)
    #Upload-SPOFile -WebUrl $teamSiteUrl -spCredentials $SPOCreds -FolderUrl $FolderUrl -FileInfo $UploadFileInfo
    $newFile = Get-Item $FileName
    Copy $newFile $File.FullName
}
$report = $null
$Data = $null

В идеале я хотел бы изменить этот сценарий для записи в файл, например:

O365SPSiteActivity-2019-Oct.csv в течение октября, затем O365SPSiteActivity-2019-Nov.csvв течение ноября и т. д. в зависимости от того, когда получены данные.

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Почему вы сначала пишете во временный файл и копируете его поверх (возможно, существующего) файла?
Если я понимаю вопрос, вы хотели бы создавать новый отчет csv каждый месяц.
Затемпочему бы просто не сделать что-то вроде этого:

# create a filename for this month
$currentReport = 'O365SPSiteActivity-{0:yyyy-MMM}.csv' -f (Get-Date)

и экспортировать -Append ваши данные в это? Если файл еще не существует, он будет создан, в противном случае к нему будут добавлены новые данные.

0 голосов
/ 28 октября 2019

Ищете текущую дату или дату из электронной таблицы?

$date = (get-date -Format dd-MM-yyyy)

будет выводиться в O365SPSiteActivity-2019-Oct.csv, если вы запустите ее сегодня.

Есливы хотите разделить CSV на основе дат в данных, я мог бы переместить export-CSV внутри цикла foreach и изменить его, используя имя, аналогичное указанному выше, вместо добавления его в массив $ Data.

$Data = "2019-May-31"
Get-Date -Format yyyy-MMM -Date ([datetime]::parseexact($Data, 'yyyy-MMM-dd', $null))
$FileName = "O365SPSiteActivity-$date.csv"
$Data | Export-Csv -Append -Path $FileName -NoTypeInformation -Force

Это запишет каждую строку в соответствующий файл CSV - в результате вы получите отдельный файл CSV для данных за каждый месяц.

Обратите внимание, что 'yyyy-MMM-dd' в parseexact должен соответствовать формату даты, в которую вы его вводите. Например, если вы сортируете его на основе $ row.'Report Period, который имеет дату 31.12.19, вместо этого это будет «MM / dd / yy» (обратите внимание, что я изменил с - на / какразделитель). Вот документация , в которой указано, что означает каждая буква.

...