Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Копирование имени файла и определённой строки из него в другой файл (http://forum.oszone.net/showthread.php?t=263732)

Liquid Ocelot 04-07-2013 12:29 2179157

Копирование имени файла и определённой строки из него в другой файл
 
Здравствуйте. Возникла необходимость решить следующую задачу:

Во время установки ПО пишется лог, в 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 2179253

Я задачу понял так. В папке 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 2179263

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 2179269

sunnykey,

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

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

Liquid Ocelot 04-07-2013 15:16 2179277

mwz, Да, Вы правы, именно так.

sunnykey 04-07-2013 16:49 2179339

Цитата:

Цитата mwz
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 2179445

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 2179579

Цитата:

Цитата Liquid Ocelot
Может быть, это я неправильно делаю? Просто до этого с PS дела не имел, может есть какие особенности? »

Что у тебя присвоено переменной $LogDir?

Liquid Ocelot 05-07-2013 00:46 2179582

sunnykey, D:\log

sunnykey 05-07-2013 03:36 2179607

Цитата:

Цитата Liquid Ocelot
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 2179671

sunnykey, Да теперь работает, спасибо большое!


Время: 11:49.

Время: 11:49.
© OSzone.net 2001-