【问题标题】:How can I append data in powershell to a different file depending on what month the data came from?如何根据数据来自的月份将 powershell 中的数据附加到不同的文件中?
【发布时间】:2019-10-28 19:10:35
【问题描述】:

我每天都在提取有关 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

理想情况下,我想更改此脚本以写入如下文件:

10 月份的 O365SPSiteActivity-2019-Oct.csv,11 月份的 O365SPSiteActivity-2019-Nov.csv,依此类推,具体取决于数据的来源。

【问题讨论】:

    标签: powershell date append office365api


    【解决方案1】:

    为什么要先写入临时文件并在完成后复制(可能存在的)文件?
    如果我理解这个问题,您希望每个月创建一个新的报告 csv。
    那么,为什么不简单地做这样的事情:

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

    然后将-Append您的数据导出到其中?如果该文件尚不存在,则创建该文件,否则将添加新数据。

    【讨论】:

    • 现在我们直接访问一个临时文件,因为通常文件写入过程是脚本失败的地方(如果它会失败)。我认为通过结合您的命名方案和每个循环的另一个想法来确定数据来自哪个月份,我可以得到我需要的东西。谢谢!
    【解决方案2】:

    您是在查找当前日期还是电子表格中的日期?

    $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 文件来存储每个月的数据。

    请注意,parseexact 中的“yyyy-MMM-dd”需要与您输入的日期格式相匹配。例如,如果您根据日期为 12/31/19 的 $row.'Report Period' 对其进行排序,则它将改为 'MM/dd/yy'(请注意,我从 - 更改为 / 作为分隔器)。这是documentation,列出了其中每个字母的含义。

    【讨论】:

    • 谢谢-我希望使用数据中的日期,所以我认为您对每个循环的建议可能是最好的。
    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多