Как динамически вставить строку в текстовый файл в PowerShell?

#html #powershell #parsing #concatenation

Вопрос:

Текст представляет собой html — файл. Линия, которая меня интересует, выглядит примерно так:

 <td>INC1234</td><td>INC1235</td><td>INC1236</td>
 

Номера INC отличаются от файла к файлу. Я хотел бы разобрать строку, сказав что-то вроде:

 if like <td>INC, then concatenate '<td><a href="https://www.website.com/='   INC#   '>"
 

Чтобы дать такой результат, как:

 <td><a href="https://www.website.com/=INC1234>INC1234</a></td><td><a href="https://www.website.com/=INC1235>INC1235</a></td><td><a href="https://www.website.com/=INC1236>INC1236</a></td>"
 

EDIT1: Хорошо, если я сделаю что-то вроде:

 $parse = (-split (Get-Content -Raw C:Tempreport.txt) -match '<td>INC')
$parse
 

Он найдет символы, но вернет всю строку, а не будет искать больше, которые соответствуют «INC». Предположительно, потому, что все они находятся в одной строке без пробелов.

EDIT2: Может быть, это поможет. Я использую PowerShell для написания команд SQL, отправки их на наш SQL-сервер, возврата данных и использования PSWriteHTML для создания отчета, который работает фантастически. Но мне нужна первая колонка, которая является номером билета (например. INC1234) , чтобы быть ссылкой на билет, который он читает.

 [CmdletBinding()]
Param(
   [Parameter(Mandatory=$True)]
   [string]$ReportName
)


## Build the query box
function Read-MultiLineInputBoxDialog([string]$Message, [string]$WindowTitle, [string]$DefaultText)
{
    Add-Type -AssemblyName System.Drawing
    Add-Type -AssemblyName System.Windows.Forms

    ## Create the Label.
    $label = New-Object System.Windows.Forms.Label
    $label.Location = New-Object System.Drawing.Size(10,10)
    $label.Size = New-Object System.Drawing.Size(280,20)
    $label.AutoSize = $true
    $label.Text = $Message

    ## Create the TextBox used to capture the user's text.
    $textBox = New-Object System.Windows.Forms.TextBox
    $textBox.Location = New-Object System.Drawing.Size(10,40)
    $textBox.Size = New-Object System.Drawing.Size(575,200)
    $textBox.AcceptsReturn = $true
    $textBox.AcceptsTab = $false
    $textBox.Multiline = $true
    $textBox.ScrollBars = 'Both'
    $textBox.Text = $DefaultText

    ## Create the OK button.
    $okButton = New-Object System.Windows.Forms.Button
    $okButton.Location = New-Object System.Drawing.Size(415,250)
    $okButton.Size = New-Object System.Drawing.Size(75,25)
    $okButton.Text = "OK"
    $okButton.Add_Click({ $form.Tag = $textBox.Text; $form.Close() })

    ## Create the Cancel button.
    $cancelButton = New-Object System.Windows.Forms.Button
    $cancelButton.Location = New-Object System.Drawing.Size(510,250)
    $cancelButton.Size = New-Object System.Drawing.Size(75,25)
    $cancelButton.Text = "Cancel"
    $cancelButton.Add_Click({ $form.Tag = $null; $form.Close() })

    ## Create the form.
    $form = New-Object System.Windows.Forms.Form
    $form.Text = $WindowTitle
    $form.Size = New-Object System.Drawing.Size(610,320)
    $form.FormBorderStyle = 'FixedSingle'
    $form.StartPosition = "CenterScreen"
    $form.AutoSizeMode = 'GrowAndShrink'
    $form.Topmost = $True
    $form.AcceptButton = $okButton
    $form.CancelButton = $cancelButton
    $form.ShowInTaskbar = $true

    ## Add all of the controls to the form.
    $form.Controls.Add($label)
    $form.Controls.Add($textBox)
    $form.Controls.Add($okButton)
    $form.Controls.Add($cancelButton)

    ## Initialize and show the form.
    $form.Add_Shown({$form.Activate()})
    $form.ShowDialog() > $null  # Trash the text of the button that was clicked.

    ## Return the text that the user entered.
    return $form.Tag
}

## Prompt the SQL Query Box
$Query = Read-MultiLineInputBoxDialog -Message "Enter SQL Query Here" -WindowTitle "SQL Query" -DefaultText "SELECT FROM"
if ($Query -eq $null) { Break }
else { Write-Host "You entered the following text: $Query" }

## Pass query to SQL Server
$Pass = Invoke-Sqlcmd -Query $Query -ServerInstance "MY-SERVER-INSTANCE" -Username "USERNAME" -Password "PASSWORD"

## Output the report and save to the network under the specified name
New-HTML {
    New-HTMLTable -EnableColumnReorder -DisableInfo -DataTable $Pass -ExcludeProperty "RowError", "RowState", "Table", `
    "ItemArray", "HasErrors" -HideFooter -PagingLength 25 -SearchBuilder

    New-HTMLTableStyle -FontFamily Calibri -FontSize 15 -FontStyle normal -TextAlign center -TextColor "#0a0a0a"
    New-HTMLTableStyle -FontFamily Calibri -BackgroundColor "#fffdb5" -FontSize 15px -TextColor "#0a0a0a" -TextAlign center -Type RowHover
    
} -ShowHTML -FilePath "\Server$ReportName.html" -Online 

 

Отчет выглядит примерно так:

 Ticket:       Description:
----------------------------
INC1234       Broken Monitor
INC1235       No Sound
 

Код HTML, который PSWriteHTML строит кидает всех билета чисел на одной строке, поэтому я хотел бы изменить HTML с помощью <a href=""> тега динамически создавать ссылки на каждый билет # в основном потому, что я не знаю, как это сделать в PS и не могу показаться, чтобы найти хороший ответ через Google, поэтому я пришел сюда.

Комментарии:

1. Звучит достаточно просто. Где у вас возникают проблемы?

2. @DougMaurer Я никогда раньше не выполнял объединение в PowerShell, и я также не уверен, как это сделать динамически. Поскольку каждый HTML-файл будет иметь разные номера INC, я не уверен, как разобрать строку, прочитать INC#, вставить часть href и перейти к следующему.

3. Мы все начинали с того, что не знали, как это сделать. Я бы рекомендовал начать с этого и попробовать. Если вы столкнетесь с кирпичной стеной после разумных усилий, поделитесь своим кодом и любыми ошибками/деталями. Эта ссылка кажется хорошей для выполнения поставленной задачи.

4. Всегда ли ячейки таблицы ( <td>...</td> ) находятся в одной строке, 3 из них в строке, как в вашем примере?

5. @MathiasR.Йессен Да. Он исходит из PSWriteHTML, генерирующего HTML-отчет с помощью PowerShell. Если я открою сгенерированный HTML-файл, все билеты INC будут в одной строке.

Ответ №1:

Хотя вы не знакомы с PsWriteHtml, я думаю, вы могли бы просто изменить Ticket свойства в массиве, который вы получаете в $Pass :

 ## Pass query to SQL Server
$Pass = Invoke-Sqlcmd -Query $Query -ServerInstance "MY-SERVER-INSTANCE" -Username "USERNAME" -Password "PASSWORD"

# convert all Tickets into hyperlinks
foreach ($item in $Pass) { 
    $item.Ticket = '<a href="https://www.website.com/={0}>{0}</a>'-f $item.Ticket 
}
 

Затем остальная часть вашего кода

 ## Output the report and save to the network under the specified name
New-HTML {...}