Войти

Показать полную графическую версию : [решено] Копирование имени файла и определённой строки из него в другой файл


Liquid Ocelot
04-07-2013, 12:29
Здравствуйте. Возникла необходимость решить следующую задачу:

Во время установки ПО пишется лог, в txt файл с именем пользователя, в формате фамилия.ио, например ivanov.ai.txt. В этом файле, в случае успешной установки ПО, содержится строка, приблизительно такого содержания: "MSI (s) (70:64) [09:35:52:211]: Продукт: Lotus Notes 8.5.3 ru -- Операция установки успешно завершена.". Все логи лежат в папке H:\Logs.
Нужно, чтобы скрипт записывал имя пользователя из названия его лог файла и строку об успешной установке в общий лог файл Log.txt, в эту же папку, в формате:

Файл Log.txt
ivanov.ai -- MSI (s) (70:64) [09:35:52:211]: Продукт: Lotus Notes 8.5.3 ru -- Операция установки успешно завершена.

Если такой строки нет, то достаточно просто имени пользователя.

sunnykey
04-07-2013, 14:44
Я задачу понял так. В папке H:\Logs лежит только два файла ivanov.ai.txt и Log.txt, нужно перечитать первый и добавить имя пользователя к каждой строке из это файла, поместив всё во второй файл.
#Powershell script.
#Don't forget unlock script executing by
#using command "Set-ExecutionPolicy RemoteSigned" or "Set-ExecutionPolicy Unrestricted"
#Save this file with ".ps1" extension
$LogPath='D:\google_drive\log.txt'
filter AddUserName {$Env:USERNAME+" -- "+$_}
if ( -not (Test-Path -Path $LogPath)) {
New-Item -ItemType File -Path $LogPath
}
Get-Content -Path "D:\google_drive\$Env:USERNAME.txt" | `
AddUserName | `
Out-File -FilePath $LogPath -Append

Liquid Ocelot
04-07-2013, 14:55
sunnykey, немного не так. Надо добавить только к строке "MSI (s) (70:64) [09:35:52:211]: Продукт: Lotus Notes 8.5.3 ru -- Операция установки успешно завершена.", если такая строка есть в файле ivanov.ai.txt и записать в Log.txt

mwz
04-07-2013, 14:59
sunnykey,

Скорее там лежит неопределённое число файлов по маске
Фамилия.ИО.txt
и один файл Log.txt.

И надо перебирать все файлы первого типа, дописывая в новую строку Log.txt имя того файла, который проверяется, и результат из этого файла (т.е. дописывая в строку Log.txt с именем файла или найденную подстроку "..... Продукт: Lotus Notes 8.5.3 ru -- Операция установки успешно завершена" или пустую подстроку если такой в файле нет).

Liquid Ocelot
04-07-2013, 15:16
mwz, Да, Вы правы, именно так.

sunnykey
04-07-2013, 16:49
sunnykey,
Скорее там лежит неопределённое число файлов по маске
Фамилия.ИО.txt
и один файл Log.txt.
И надо перебирать все файлы первого типа, дописывая в новую строку Log.txt имя того файла, который проверяется, и результат из этого файла (т.е. дописывая в строку Log.txt с именем файла или найденную подстроку "..... Продукт: Lotus Notes 8.5.3 ru -- Операция установки успешно завершена" или пустую подстроку если такой в файле нет). »
Скрипт теперь перебирает все текстовые файлы, за исключением log.txt. Находит последнюю строку в файле равную Lotus Notes 8.5.3 ru -- Операция установки успешно завершена, добавляет имя из названия файла и записывает в log.txt. Если ни одна строка по шаблону не найдена, то пишет просто имя из файла. Надеюсь правильно.
#Powershell script.
#Don't forget unlock script executing by
#using command "Set-ExecutionPolicy RemoteSigned" or "Set-ExecutionPolicy Unrestricted"
#Save this file with ".ps1" extension
$LogDir='D:\google_drive'
$LogPath="$LogDir\log.txt"

filter AddUserName ([string]$uname){
if ($_ -ne $null) {
$uname.TrimEnd(".txt")+" -- "+$_
}
}

if ( -not (Test-Path -Path $LogPath)) {
New-Item -ItemType File -Path $LogPath
}
Set-Location -Path $LogDir
$FileList=Get-ChildItem -Path ".\*" -Include "*.txt" -Exclude "log.txt" -File
foreach ($el in $FileList) {
$CurStr=Get-Content -Path $el | Select-String -Pattern `
"Продукт: Lotus Notes 8.5.3 ru -- Операция установки успешно завершена." | `
Select-Object -Last 1
if ($CurStr -eq $null) {
$CurStr=" "
}
$CurStr | AddUserName -uname $el.Name | Out-File -FilePath $LogPath -Append
}

Liquid Ocelot
04-07-2013, 19:57
sunnykey, хм, не хочет работать. В log.txt просто записывает «--» и всё. Вот что выдаёт в качестве ошибки:
Get-ChildItem : Не удается найти параметр, соответствующий имени параметра "File".
D:\log\Test.ps1:18 знак:78
+ $FileList=Get-ChildItem -Path ".\*" -Include "*.txt" -Exclude "log.txt" -File <<<<
+ CategoryInfo : InvalidArgument: (:) [Get-ChildItem], ParameterBindingExc
eption
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetC
hildItemCommand

Get-Content : Не удается привязать аргумента к параметру "Path", так как он имеет значен
ие NULL.
D:\log\Test.ps1:20 знак:30
+ $CurStr=Get-Content -Path <<<< $el | Select-String -Pattern `
+ CategoryInfo : InvalidData: (:) [Get-Content], ParameterBindingValidatio
nException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.
PowerShell.Commands.GetContentCommand
Может быть, это я неправильно делаю? Просто до этого с PS дела не имел, может есть какие особенности?

sunnykey
05-07-2013, 00:33
Может быть, это я неправильно делаю? Просто до этого с PS дела не имел, может есть какие особенности? »
Что у тебя присвоено переменной $LogDir?

Liquid Ocelot
05-07-2013, 00:46
sunnykey, D:\log

sunnykey
05-07-2013, 03:36
sunnykey, D:\log »
Скорее всего у тебя PS 2.0, а там нет атрибута -File. Переделал
#Powershell script.
#Don't forget unlock script executing by
#using command "Set-ExecutionPolicy RemoteSigned" or "Set-ExecutionPolicy Unrestricted"
#Save this file with ".ps1" extension
$LogDir='D:\google_drive'
$LogPath="$LogDir\log.txt"

filter AddUserName ([string]$uname){
if ($_ -ne $null) {
$uname.TrimEnd(".txt")+" -- "+$_
}
}

if ( -not (Test-Path -Path $LogPath)) {
New-Item -ItemType File -Path $LogPath
}
Set-Location -Path $LogDir
$FileList=Get-ChildItem -Path ".\*" -Include "*.txt" -Exclude "log.txt" | `
where {$_.Attributes -ne [System.IO.FileAttributes]::Directory}
foreach ($el in $FileList) {
$CurStr=Get-Content -Path $el | Select-String -Pattern `
"Продукт: Lotus Notes 8.5.3 ru -- Операция установки успешно завершена." | `
Select-Object -Last 1
if ($CurStr -eq $null) {
$CurStr=" "
}
$CurStr | AddUserName -uname $el.Name | Out-File -FilePath $LogPath -Append
}

Liquid Ocelot
05-07-2013, 09:35
sunnykey, Да теперь работает, спасибо большое!




© OSzone.net 2001-2012