Powershell脚本,用于从文件夹

时间:2018-04-28 17:49:18

标签: powershell

我们有一个程序可以创建电子邮件签名并将它们存储在部署文件夹中,然后在登录时保存到用户本地文件夹。但是当员工未分配到办公室时,城市/州的逗号分隔符如本例所示,仍然会出现这种情况:

Example Email signature

问题是程序源代码无法找到。长期我会重写它。短期我需要一个powershell脚本,每晚运行以删除包含逗号的行。在Stackoverflow上找到以下解决方案:

Get-ChildItem C:\temp\emailsigs -Filter *.htm | Foreach-Object{
(Get-Content $_.FullName) | 
Foreach-Object {$_ -replace " ,   &nbsp; ,   &nbsp; <br />", ""} | 
Set-Content $_.FullName
}

这实际上效果很好。但我注意到,即使只有2个电子邮件签名需要删除空的逗号行,每个签名HTM文件(超过1100)也会获得时间戳更新。是否有更有效的方法来首先检查文件是否包含令人讨厌的逗号然后替换并跳过大多数?

2 个答案:

答案 0 :(得分:2)

以下PSv5 +解决方案不会提高内存效率,但应加快处理速度,同时避免重写不需要的文件:

Get-ChildItem C:\temp\emailsigs -Filter *.htm |
  ForEach-Object {
    $oldContent = Get-Content -Raw $_.FullName
    $newContent = $oldContent -replace ' ,   &nbsp; ,   &nbsp; <br />'
    if ($newContent.Length -lt $oldContent.Length) { # was a replacement performed?
      Set-Content $_.FullName -NoNewline -Value $newContent
    }
  }
  • -Raw是PSv3 +,并将整个文件作为单字符串读取。

    • 在PSv2中,您可以使用[System.IO.File]::ReadAllText()代替,但请注意,在没有BOM的情况下,它假设UTF-8为编码,而Get-Content则假设为&#34; ANSI&#34;编码 [1] (系统的遗产&#34; ANSI&#34;代码页),因此您可能必须明确指定编码。
  • 将每个文件作为单个字符串处理可加快处理速度(尽管每个文件必须适合内存两次)。如果正则表达式不匹配,利用-replace保留未修改的输入字符串,我们可以将原始内容的长度与替换内容的长度进行比较,以查看是否匹配了某些内容以及文件是否需要重写。
    因此,我们每个文件只需要一个正则表达式操作。

    • 另请注意,... -replace '...' - 即未指定替换字符串 - 相当于... -replace '...', '',即有效删除匹配。
  • -NoNewline需要PSv5 +;它可以防止附加换行符附加到输出中。

    • 在PSv4中,您可以改为使用[System.IO.File]::WriteAllText(),但请注意其默认编码为UTF-8 ,不含BOM ,而Set-Content则为Get-Content },默认为&#34; ANSI&#34;编码 [1]

[1]以上内容适用于 Windows PowerShell 。跨平台PowerShell Core版本默认为(无BOM)UTF-8。

答案 1 :(得分:0)

其他方法

Get-ChildItem C:\temp\emailsigs -file -Filter *.htm | foreach{

$CurrentFile=$_

$Content=Get-Content $CurrentFile.FullName -Encoding UTF8

if ($Content -like '* ,   &nbsp; ,   &nbsp; <br />*')
{
    $Content.Replace(' ,   &nbsp; ,   &nbsp; <br />', '') | Set-Content $CurrentFile.FullName -Encoding UTF8
}

}

我使用utf8来保持变音符号