Powershell - добавляет пробелы после очистки файла журнала - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть скрипт, который пишет в файл журнала,

В начале скрипта я добавил строки, чтобы удалить X количество первых строк, а затем продолжил запись в этот журнал

# Get number of lines of log file 
$logfileLines = Get-content $LogFile | Measure-Object –Line | select -ExpandProperty Lines

# If number of lines is more than 5000, remove first 4000 lines

if($logfileLines -gt '5000') {

     (Get-Content $LogFile | Select-Object -Skip 4000) | Set-Content $LogFile

  }
  # write something to log file
   filter timestamp {"$(Get-Date -Format G): $_"}
   write-output "############### Starting Script for adding new user ##############" | timestamp >> $LogFile
  Write-Verbose "Connecting to Mailbox" 
  write-output "Connecting to Mailbox" | timestamp >> $LogFile

Это работает нормально, файл журнала усекается, но когда скрипт продолжает писать, для следующих строк он добавляет пробелы после каждого символа

4/15/2020 10:17:10 AM: No emails found, exiting
4 / 1 5 / 2 0 2 0   1 0 : 3 9 : 2 1   A M :   # # # # # # # # # # # # # # #   S t a r t i n g   S c r i p t   f o r   a d d i n g   n e w   u s e r   # # # # # # # # # # # # # # 

 4 / 1 5 / 2 0 2 0   1 0 : 3 9 : 2 1   A M :   C o n n e c t i n g   t o   M a i l b o x 

 4 / 1 5 / 2 0 2 0   1 0 : 3 9 : 2 7   A M :   C o n n e c t i o n   t o   M a i l b o x   f i n i s h e d 

 4 / 1 5 / 2 0 2 0   1 0 : 3 9 : 2 7   A M :   S e a r c h i n g   ' P r o c e s s e d '   f o l d e r . . 

 4 / 1 5 / 2 0 2 0   1 0 : 3 9 : 2 7   A M :   E m a i l   s e a r c h   c o m p l e t e d 

 4 / 1 5 / 2 0 2 0   1 0 : 3 9 : 2 7   A M :   N o   e m a i l s   f o u n d ,   e x i t i n g 

Пытался также создать «временный» файл журнала, но те же результаты

Get-Content $LogFile | Select-Object -Skip 100 | Set-Content "C:\User\temp.log"
      move "C:\User\temp.log" $LogFile -Force

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Скорее всего, это не пробелы, а нулевые символы, потому что строки - это Unicode в памяти, которые для символов ASCII состоят из первого байта, содержащего символ, и второго байта 0x00.

В Windows, это может быть комбинацией многих вещей, включая то, что кодовая страница установлена ​​для хоста консоли (например, conhost.exe), а также [Console]::OutputEncoding для PowerShell и то, какую кодировку файл уже использовал. При вызове Set-Content вы можете использовать Set-Content -Encoding Unicode "C:\User\temp.log", так как кажется, что ваша программа timestamp фактически записывает символы Юникода в стандартный вывод, игнорируя то, для чего установлена ​​ваша кодовая страница консоли.

Но это, вероятно, будет проще просто отформатируйте строку с отметкой времени прямо в файле, и будет использоваться вся кодировка по умолчанию, которую знает PowerShell.

function Log([string] $message) {
  ("{0:G} $message" -f [DateTime]::UtcNow) >> 'C:\User\temp.log'
}

Log 'Connecting to mailbox'

Если вы решите продолжать использовать timestamp, либо посмотрите, можете ли вы контролировать это выходная кодировка (поскольку он не определяет его должным образом) или передача Unicode в Set-Encoding или Add-Encoding - последний для добавления содержимого.

1 голос
/ 15 апреля 2020

Разобрался, изменил Set-Content на Out-File, также нет необходимости использовать "временный" файл

(Get-Content $LogFile | Select-Object -Skip 100) | Out-File $LogFile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...