#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 {...}