【问题标题】:Need to Search an csv file and run an if/Where statement on the value to initialize a bat file需要搜索 csv 文件并对值运行 if/Where 语句以初始化 bat 文件
【发布时间】:2019-08-19 20:24:29
【问题描述】:

一旦系统内存使用量超过70%,想清除我的缓存 我有一个任务计划程序来开始监控、一个性能日志的数据收集以及导出到 csv 的报告、一个触发清除的自定义事件视图以及一个清除缓存的 bat 文件。

这是我拼图的最后一块。

据我所知,cmd 和 powershell 中的所有内容都已使用

它有一个包含三个字段的标题,然后是 4 个信息单元格。 (A2, B2, A3, B3)

powershell -command {Import-Csv -Path 'C:\PerfLogs\Admin\New Data Collector Set\Memory DataCollector01.csv' | Where{ $_.B3 -gt  "70.000000000000000"} | start-process $env:userprofile\Desktop\creatvent.bat}\

这是在 power shell 和记事本上输出的性能报告:

(PDH-CSV 4.0) (Eastern Daylight Time)(240) \\LT305-MIA\Memory\% Committed Bytes In Use Collect memory data usage percentage
------------------------------------------ ------------------------------------------- ------------------------------------  
08/19/2019 12:18:32.480                   41.363952528071579  
08/19/2019 12:19:32.467                   41.291049993897566


"(PDH-CSV 4.0) (Eastern Daylight Time)(240)","\\LT305-MIA\Memory\% Committed Bytes In Use","Collect memory data usage percentage"
"08/19/2019 15:38:37.582","47.54470529676059"," "
"08/19/2019 15:39:37.569","47.43784841788883"," "

我想让这段代码正常工作。知道它每次都运行(无论值如何)我需要它才能正常运行。

【问题讨论】:

  • 这些名称(A2、B2、A3 和 B3)从何而来?第三列似乎是内存利用率。对吗?
  • 能否将输出作为格式化文本添加到问题本身中?在评论中很难阅读,并且看起来开头有几行使内容不是有效的 csv..
  • @lit 我添加的名称以供参考,是的,数据是内存使用情况。 -Theo 会尝试更清楚地编辑。
  • @Theo .csv 有效且代码触发事件。只是不正​​确。
  • 尝试从70 中删除引号。 { $_.B3 -gt 70 }

标签: powershell cmd path import-csv start-process


【解决方案1】:

由于您的文件(如您显示的那样)只有三列包含实际数据并且使用的标题不是很友好,我建议您这样做:

  • 使用Get-Content将文件作为字符串数组读取。
  • 跳过丑陋的标题行
  • 使用自定义标题将其余行转换为 CSV
  • 使用Where-Object 子句在第二列中搜索大于70 的数值
if (Get-Content -Path 'C:\PerfLogs\Admin\New Data Collector Set\Memory DataCollector01.csv' | 
    Select-Object -Skip 1 | 
    ConvertFrom-Csv -Header 'Date','MemoryUsage','DataUsage' | 
    Where-Object { [int]$_.MemoryUsage -gt 70 }) {
        # in here, run your .bat file to clear the cache
        Start-Process "$env:userprofile\Desktop\creatvent.bat"
}

【讨论】:

  • Windows blg 文件,嗯?超级大的帮助......这会让我头疼好几天。 +1 代表
  • Where-Object { [int]$_.MemoryUsage -gt 70 } [int] 第一行是 [0],第二行是 [1]?其余的都是有道理的
  • @Andrew 我正在使用您显示的输出(我认为是记事本视图)。那是数据被引用和逗号分隔的最后三行。如果您显示的内容都在一个文件中,则跳过所有行,包括不那么友好的标题。在您的示例中Select-Object -Skip 7
【解决方案2】:

抱歉,如果我没有正确理解,这是我的示例 .csv:

h1;h2;h3;
08/19/2019;12:18:32.460;41.363952528071579
08/19/2019;12:19:32.467;41.291049993897566
08/19/2019;12:18:31.480;78.363952528073254

并执行此代码:

Import-Csv .\file.csv -Delimiter ";" | Where-Object -Property h3 -gt 77

控制台显示结果:

h1         h2           h3
--         --           --
08/19/2019 12:18:31.480 78.363952528073254

你可以试试看结果吗?

【讨论】:

  • 我的输出如上所示。使用分隔符时,需要一个参数类型“System.Char”。仅使用 'Where-Object -Property headerinfo -gt 77,它指出无法绑定 'Delimiter' 并且无法将 Data 转换为 System.Char 类型
猜你喜欢
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
相关资源
最近更新 更多