Как я могу редактировать HTML-тег с помощью PowerShell? - PullRequest
1 голос
/ 04 февраля 2011

Я создал скрипт PS, который запрашивает журналы событий на моих серверах, а затем записывает информацию в обычный старый HTML-файл.Проблема в том, что HTML-файл - это просто, plian.Я хочу добавить в него DataTables jquery, чтобы я мог отсортировать и упорядочить его.

Используя командлет «ConvertTo-HTML -head», я могу вставить нужный мне код в заголовок документа до написания документа.После того, как файл написан, мне нужно открыть его и изменить на.

Проблема, с которой я сталкиваюсь, заключается в том, что когда скрипт попадает в часть тега замены, я получаю эту ошибку:

Set-Content: процесс не может получить доступ к файлу C: \users \ norm \ Documents \ eventlogs \ 2011 \ 02 \ System \ 04 \ tc2.html ', поскольку он используется другим процессом.

Я подозреваю, что это потому, что канал используется для открытияфайл по-прежнему открыт.Так как мне закрыть файл?или есть лучший способ сделать это?

Спасибо, Норма

    # EventLog viewer

# Head for the HTML document. Adds the CSS and JQuery DataTables to the document. 
$h = '<head> <meta http-equiv="pragma" content="no-cache" />'
$h = $h + '<title>Celeste EventLog Viewer</title>'
$h = $h + '<link type="text/css" rel="stylesheet" href="css/demo_table_jui.css" />'
$h = $h + '<link type="text/css" rel="stylesheet" href="themes/base/jquery.ui.all.css" />'
$h = $h + '<link type="text/css" rel="stylesheet" href="css/stdcst.css" />'
$h = $h + '<script language="JavaScript" src="js/jquery.min.js"></script>'
$h = $h + '<script language="JavaScript" src="js/jquery.dataTables.js"></script>'
$h = $h + '</head>'
$h = $h + '<script type="text/javascript"> $(document).ready(function() {$("#t1").dataTable( {"bJQueryUI": true,"sPaginationType": "full_numbers",  "bInfo" : true  } ); });</script>'
$ServerNames = "s1","s2","s3","s4","s5","s6","s7","s8","s9"
$outdir = 'C:\users\norm\Documents\eventlogs\'
$year = get-date -uformat "%Y" 
$month = get-date -uformat "%m"
$day = get-date -uformat "%d"
$count = $ServerNames.length

# Get the length of ServerNames, iterate through x until x is greater than ServerNames

for ($x=0; $x -lt $count; $x++)
    {
        # Before writing the file can begin the output directory needs to exsist. Test that it does, if not create it.
        if (( Test-Path -path $outdir$year\$month\System\$day\) -ne $True)
            {
                New-Item $outdir$year\$month\System\$day\ -type directory
            }
        if (( Test-Path -path $outdir$year\$month\Application\$day\) -ne $True)
            {
                New-Item $outdir$year\$month\Application\$day\ -type directory
            }
        echo "Getting System log from " $ServerNames[$x]
        #Query the System Event log and write it to an html file
        Get-EventLog -computername $ServerNames[$x]  -LogName System | ConvertTo-HTML -head $h | Out-File -encoding utf8 $outdir$year\$month\System\$day\"$($ServerNames[$x]).html";
        # Query the Aplication Event log and write it to an html file
        echo "Getting Application log from " $ServerNames[$x]
        Get-EventLog -computername $ServerNames[$x]  -LogName Application | ConvertTo-HTML -head $h | Out-File -encoding utf8 $outdir$year\$month\Application\$day\"$($ServerNames[$x]).html";
    }

for ($x=0; $x -lt $count; $x++)
     {
        #Open the files and replace the table tag
         Get-Content $outdir$year\$month\System\$day\"$($ServerNames[$x]).html" | ForEach-Object { $_ -replace '<table>', '<table id="t1">'} | Set-Content $outdir$year\$month\"$($ServerNames[$x]).html";
     }

    #give me a message to let me know the script has completed. 
    echo "Done!"

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

Я бы использовал Дескриптор , чтобы выяснить, какой процесс обращается к файлу. Также вы можете использовать ProcessExplorer (запустить, нажать CTRL + F, ввести имя файла, Enter).

Edit:

После просмотра вашего кода я вижу проблему. Линия Get-Content | process something | Set-Content это ваша проблема. Измените это на это:

$a = Get-Content ... | process ...
$a | Set-Content

Командлет Get-Content открывает файл, читает одну строку и отправляет строку в pipe. Затем он обрабатывается, и эта первая строка передается в Set-Content. Set-Content хотел бы написать, но Get-Content еще не закончил, потому что он читает только первую строку.

1 голос
/ 04 февраля 2011

Пока ты у него:

  $h = @"
  <title>Celeste EventLog Viewer</title>
  <link type="text/css" rel="stylesheet" href="css/demo_table_jui.css" />
  <link type="text/css" rel="stylesheet" "href="themes/base/jquery.ui.all.css" />
  <link type="text/css" rel="stylesheet" href="css/stdcst.css" />
  <script language="JavaScript" src="js/jquery.min.js"></script>
  <script language="JavaScript" src="js/jquery.dataTables.js"></script>
  </head>
  <script type="text/javascript"> $(document).ready(function() {$("#t1").dataTable( {"bJQueryUI": true,"sPaginationType": "full_numbers",  "bInfo" : true  } ); });</script>
  "@
1 голос
/ 04 февраля 2011

Не похоже, что необходимо записать его в файл, а затем прочитать обратно, чтобы заменить этот тег:

Get-EventLog -computername $ServerNames[$x]  -LogName System |
  ConvertTo-HTML -head $h |
    foreach-object { $_ -replace '<table>', '<table id="t1">'} |
   Out-File -encoding utf8 $outdir$year\$month\System\$day\"$($ServerNames[$x]).html"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...