首页 > 解决方案 > 预定脚本添加到 xlsx 中的新单元格

问题描述

我正在尝试通过监视从网络目录中复制大文件所需的时间来复制最终用户体验。

Measure-Command用来查找将项目从网络目录复制到计划此脚本的计算机(使用 Windows 计划程序)并以 xlsx 格式输出时间所需的总时间。

我遇到的问题是,每次该脚本从调度程序(每天)运行时,它都会覆盖前一天的数据,而不是将结果发布到下一个单元格中。当我多次手动运行它时,它工作得很好,并且在彼此下发布了单独的结果。我认为问题在于它是由实例运行的(因此在同一个 PowerShell 实例中运行代码几次可以看到$previousRow工作正常,但在每日计划中,它每次都会打开一个新实例并覆盖单元格中的旧数据(1,1) 和 (1,2)。

关于如何保留历史数据的任何建议?

$seconds = Measure-Command {
    Copy-Item -Path X:\shareddrive\test.pdf -Destination C:\Users\Me\Desktop
} | select TotalSeconds

$erroractionpreference = "SilentlyContinue"
$a = New-Object -ComObject Excel.Application
$dt = Get-Date -Format "MM/dd/yyyy hh:mm:ss"
$a.Workbooks.Open("X:\shareddrive\output\timesample.xlsx")
$a.Visible = $true
$a.Worksheets.Item(1)

$previousRow += 1
$a.Cells.Item($previousRow,1) = "OfficeLocation - " + $dt
$a.Cells.Item($previousRow,2) =  $seconds.TotalSeconds

$a.ActiveWorkbook.Save()
$a.Workbooks.Close()
$a.Quit()
Remove-Item -Path C:\Users\Me\Desktop\test.pdf

标签: excelpowershell

解决方案


不确定您是否还没有复制所有代码?但看起来你实际上并没有在$previousRow任何地方定义?因此,您现有的代码运行$previousRow += 1并设置$previousRow为 1... 这意味着每次代码运行时,它都会首先到达第 1 行

为了能够找到其中包含最后信息的行(即将 $previousValue 设置为 + 1 的值),您可以使用以下代码:

$filepath = "C:\Folder\ExcelFile.xlsx"
$objExcel = New-Object -ComObject Excel.Application
$objExcel.Visible = $False
$WorkBook = $objExcel.Workbooks.Open($filepath)
$WorkSheet = $objExcel.WorkSheets.item(1)
$WorkSheet.activate()

[int]$lastRowvalue = ($WorkSheet.UsedRange.rows.count + 1) - 1
$lastrow = $WorkSheet.Cells.Item($lastRowvalue, 1).Value2
write-host $previousValue 
write-host $lastRowvalue

从此处复制/粘贴(稍作修改):获取 Excel 中使用的最后一个单元格的值

这会告诉您最后一行的数据...所以您需要先将 1 添加到该行,然后再将其设置为 $previousRow 的值:

$previousRow = $previousRow + 1

推荐阅读