首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PS1替换或删除单个字符而不重写整个文件

PS1替换或删除单个字符而不重写整个文件
EN

Stack Overflow用户
提问于 2019-04-25 00:28:53
回答 1查看 0关注 0票数 0

是否可以使用PowerShell 1删除或替换文件的最后一个非空白行上的最后一个字符?

我正在尝试在5分钟内获得准确的Uptime日志。

我发现有可以通过命令提示符访问的构建日志和命令,可以告诉我上次启动计算机的时间,或者当它正确关闭时,但本机正常运行时间日志仅每24小时记录一次因此,如果出现电源故障,我不知道系统脱机了多长时间,精确度超过24小时。

所以我创建了以下脚本:

代码语言:javascript
复制
$bootTime = (Get-WmiObject Win32_OperatingSystem).LastBootUpTime
$formBootTime = [Management.ManagementDateTimeConverter]::ToDateTime($bootTime)
$uptime = (Get-Date)-$formBootTime
"$formBootTime,$(Get-Date),{0:00},{1:00},{2:00},{3:00}" -f $uptime.Days,$uptime.Hours,$uptime.Minutes,$uptime.Seconds >> C:\UptimeTracker.csv

但是,当我想评估我的机器在过去X天运行了多长时间时,滚动浏览的时间非常繁琐。

所以我想我会添加一个标记来识别每个给定Boot的当前或最新的Uptime日志。

但为了使其工作,我需要能够在前一条记录不再是相关记录时立即删除所述标记。

代码语言:javascript
复制
$bootTime = (Get-WmiObject Win32_OperatingSystem).LastBootUpTime
$formBootTime = [Management.ManagementDateTimeConverter]::ToDateTime($bootTime)
$file = (Get-Content c:\UptimeTracker.csv | Measure-Object)
$numberOfLines = $file.Count
$numberOfWords = (Get-Content c:\UptimeTracker.csv | Select -Index ($numberOfLines -1) | Measure-Object -word)
$Line = Get-Content c:\UptimeTracker.csv | Select -Index ($numberOfLines -2)
$wordArray = $Line.Split(",")
$LastLineBT = $wordArray[0]
if($LastLineBT -eq $formBootTime) {
    $unmark = "true"
}
else
{$unmark = "false"}

if($unmark == "true"){ <remove last character of file> }

$uptime = (Get-Date)-$formBootTime 
"$formBootTime,$(Get-Date),{0:00},{1:00},{2:00},{3:00},X" -f $uptime.Days,$uptime.Hours,$uptime.Minutes, $uptime.Seconds >> C:\UptimeTracker.csv

我已经看到几种方法接收文件作为输入文件并写入不同的输出文件,从那里脚本重命名新旧文件切换位置是一件容易的事(新旧,待机,待机 - 并且旋转)我试图不重写整个文件的原因是为了减少那些命令/脚本被中断并且操作没有完成的实例。理想情况下,动作未完成的唯一时间是电源故障。但是,我已经在之前的版本中看到,它偶尔会跳过5分钟,最多15分钟,而上次报告的启动时间没有任何变化。 我怀疑这与其他更高优先级的进程有关,阻止任务调度程序运行脚本。 如果是这种情况,那么完全重写文件失败的部分文件会丢失现有日志数据的一部分,我宁愿错过最新记录而不是所有数据。

我找不到任何东西表示有能力删除/替换最后一个字符(或者两个,因为一个是换行符),我也没有找到任何明确声明这是不可能的 - 我发现声明无法选择性替换内部或开头的内容没有完全重写。

除非任何解决方案明确答案,或者如果确定答案是否定的,那么我将尝试以下内容:

代码语言:javascript
复制
if($unmark == "true"){     
    $input = "C:\UptimeTracker_CUR.csv"
    $output = "C:\UptimeTracker_NEW.csv"

    $content = Get-Content $input
    $content[-2] = $content[-2] -replace 'X', ' '
    $content | Set-Content $output
    Rename-Item -Path "C:\UptimeTracker_CUR.csv" -NewName "C:\UptimeTracker_SBY.csv"
    Rename-Item -Path "C:\UptimeTracker_NEW.csv" -NewName "C:\UptimeTracker_CUR.csv"
}
EN

回答 1

Stack Overflow用户

发布于 2019-04-25 09:45:45

你多次阅读整个文件,减慢了整个脚本的速度。我建议读取整个文件,确定是否需要清除标志,然后在输出时执行此操作,将新行添加到文件中。假设您还没有运行PowerShell v2,您可以这样做:

代码语言:javascript
复制
$bootTime = (Get-WmiObject Win32_OperatingSystem).LastBootUpTime
$formBootTime = [Management.ManagementDateTimeConverter]::ToDateTime($bootTime)
$uptime = (Get-Date)-$formBootTime
$File = Get-Content c:\UptimeTracker.csv -raw
if($File.trim().split("`n")[-1].Split(',')[0] -eq $formBootTime){
    $File.trim() -replace 'X(?=\s*$)',' '
}else{
    $File.Trim()
},("$formBootTime,$(Get-Date),{0:00},{1:00},{2:00},{3:00},X" -f $uptime.Days,$uptime.Hours,$uptime.Minutes, $uptime.Seconds)|Set-Content c:\UptimeTracker.csv
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100009024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档