Скрипт Powershell для удаления строки текста из файлов в папке - PullRequest
0 голосов
/ 28 апреля 2018

У нас есть программа, которая создает подписи электронной почты и сохраняет их в папке развертывания, которая затем сохраняется в локальной папке пользователей при входе в систему. Однако, когда сотрудник не назначен в офис, разделитель запятых для города / штата все еще приезжайте для поездки, как показано в этом примере:

Пример подписи электронной почты

Проблема в том, что исходный код программы не найден. В долгосрочной перспективе я это перепишу. В краткосрочной перспективе мне нужен скрипт powershell, который будет запускаться каждую ночь, чтобы удалить строку, содержащую запятые. Нашел здесь следующее решение в Stackoverflow:

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

Это на самом деле работает довольно хорошо. Но я замечаю, что каждый файл подписи HTM (более 1100) получает обновление метки времени, даже когда только две подписи электронной почты должны удалить пустую строку запятой. Есть ли более эффективный способ сначала проверить, не содержит ли файл запятые, которые можно заменить, а затем заменить и пропустить большинство?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Другой метод

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 для поддержания диакритики

0 голосов
/ 28 апреля 2018

Следующее решение 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(), но имейте в виду, что в качестве кодировки используется кодировка UTF-8, тогда как Get-Content предполагает кодировку "ANSI" [1] (устаревшая кодовая страница системы «ANSI»), поэтому вам может потребоваться явно указать кодировку.
  • Обработка каждого файла в виде одной строки ускоряет обработку (хотя каждый файл должен помещаться в память дважды). Пользуясь преимуществом -replace, оставляя входную строку неизменной, если регулярное выражение не совпадает, мы можем сравнить длину исходного содержимого с длиной замененного содержимого, чтобы увидеть, соответствует ли что-то и что, следовательно, файл нуждается в перезаписи.
    Таким образом, нам нужна только одна операция регулярного выражения для файла.

    • Также обратите внимание, что ... -replace '...' - т.е. без указания строки replace - эквивалентно ... -replace '...', '', т. Е. эффективно удаляет того, что было найдено.
  • -NoNewline требуется PSv5 +; он предотвращает добавление дополнительного символа новой строки к выводу.

    • В PSv4- вы могли бы вместо этого использовать [System.IO.File]::WriteAllText(), но имейте в виду, что его кодировкой по умолчанию является UTF-8 без спецификации , тогда как Set-Content, как и Get-Content, по умолчанию имеет значение "ANSI" кодирование [1] * 1 049 *.

[1] Вышеуказанное относится к Windows PowerShell . Кроссплатформенная PowerShell Core редакция по умолчанию также (без спецификации) UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...