Форматирование вывода из Invoke-WebRequest в Powershell - PullRequest
0 голосов
/ 12 марта 2019

Информация

Итак, я собираюсь почистить мою локальную интранет, где наша HR-команда загрузит новую стартовую информацию и сможет либо сохранить эту информацию в удобном для использования формате, либо экспортировать ее в CSV длязатем использовать другой сценарий.

В настоящее время наша команда службы поддержки вручную просматривает эту страницу в интрасети и создает пользователей на основе информации, которую наша кадровая команда вводит один за другим.

Естественно,это очень трудоемкая задача, которую можно легко автоматизировать.К сожалению, наша команда HR не открыта для каких-либо изменений в процессе в настоящее время из-за другой работы, на которой они сосредоточены.Внутриполитические вещи, так что, к сожалению, их невозможно убедить.

Теперь мне удалось использовать Invoke-WebRequest и получить содержимое страницы, но форматирование ужасное.Он возвращается как загрузка HTML, и я повторяю несколько этапов разбиения и замены строк, которые просто не кажутся мне оптимальными, и я чувствую, что есть лучший способ получить желаемые результаты.

Текущий сценарий

$webRequest = Invoke-WebRequest -Uri "http://intranet-site/HR/NewStarterList.php?action=ItToComp" -Headers @{"Header Info here"} -UseDefaultCredentials

$content = $webRequest.Content

$initialReplace = $content -replace '(?<=<).*?(?=>)', ' '
$split = $initialReplace -split "< >< >< >"
$split = $split -split "< >< >"
$split = $split -replace '< >',""
$split = $split[5..$($split.count)]

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

Исходный контент возвращается, как показано ниже (я сократил и заменил любые имена, чтобы было проще на глаз)

<html>
<head>
<title>New Starter List</title>
<link rel="STYLESHEET" type="text/css" href="/common/StyleSheet/Reports.css" /> <style> TD  {font-family: Verdana; font-size: 8pt; border-left: solid 0px black; border-right: solid 0px black;}    </style>
<script type="text/javascript" src="../../../cgi-bin/calendar/tableH.js"></script>
</head>
<body>
<img src="/common/images/logo.gif" border="0">
<br>
<br>
<b><span style="font-size: 12pt; font-variant: small-caps; ">New Starter List</span></b>
<br>Logged In As &quot;UserName&quot;<br>
<br>
<tableonMouseOver="javascript:trackTableHighlight(this.event,'FFFF66');"onMouseOut="javascript:highlightTableRow(0);" border="4" frame="border" width="80%" rules="none" cellspacing="6%" cellpadding="6%">
<th align="left">Date Started</th>
<th align="left">Name</th>
<th align="left">Initials</th>
<th align="left">Department</th>
<th align="left">Contact</th>
<th align="left">IT Completed?</th>
<th align="left">Supervisor Completed?</th>
<tr colspan="6"><td  align="left">25 Sep 2019</td>
<td  align="left"><a href="NewStarterInfo.php?id=3117">Joe Bloggs</a></td>
<td  align="left">JXBL</td>
<td  align="left">Team A</td>
<td  align="left">Manager 1</td>
<td  align="left">No</td>
<td  align="left">Yes</td></tr>
<tr colspan="6"><td  align="left">08 Jul 2019</td>
<td  align="left"><a href="NewStarterInfo.php?id=3149">Harry Bloggs</a></td>
<td  align="left">HXBL</td>
<td  align="left">Team B</td>
<td  align="left">Manager 2</td>
<td  align="left">No</td>
<td  align="left">Yes</td></tr>
<th align="left" colspan="7">72 starters</th>
</table>
</body>
</html>

После того, как я заполнил свои сплиты и заменил, он выглядит как ниже (опять же, имена изменились)

25 Sep 2019
Joe Bloggs
JXBL
Team 1
Manager 1
No
Yes
08 Jul 2019
Harry Bloggs
HXBL
Team 2
Manager 2
No
Yes
72 starters

Идея состоит в том, чтобы затем иметь возможность работать с этой информацией для автоматизации нашего процесса адаптации.

Мне кажется, что я упускаю что-то очевидное, например, есть аккуратный илиболее эффективный способ сделать это, так как я впервые использую Invoke-WebRequest и нахожу это проблематичным в любом случае.

Ожидаемые результаты

Желательно, чтобы массив был предпочтительноиспользованияrs со свойствами для каждого бита информации, например, CSV или PSObject.

Поэтому, когда я вызываю переменную, содержащую информацию, я хочу, чтобы она возвращала что-то вроде следующего:

Name              : Joe Bloggs
Initials          : JXBL
Department        : Team 1
Manager           : Manager 1
IT                : No
Supervisor        : No

StartDate         : 08 Jul 2019
Name              : Harry Smith
Initials          : HXSM
Department        : Team 2
Manager           : Manager 2
IT                : Yes
Supervisor        : No

Подобные вопросы

Я видел только один вопрос, который, казалось, мог охватить то, что я хотел, но в итоге мне понадобился цикл "try-catch". Аналогичный вопрос Ссылка

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, или если у вас есть какие-либо вопросы.

Заранее спасибо за помощь.

РЕДАКТИРОВАТЬ

Добавлен бит ожидаемых результатов, поскольку я понял, что этого не было.

1 Ответ

1 голос
/ 12 марта 2019

Хитрость заключается в том, чтобы иметь что-то для обозначения линий, которые вы хотите сохранить.

В приведенном выше примере ссылка выделяется:

  <a href="NewStarterInfo.php?id=3117">

Таким образом, если вы импортируете страницу как один массив, вы можете проанализировать этот массив, найдя только строки, которые содержат, например, «NewStarterInfo.php».

$a = @"
<html>
<head>
<title>New Starter List</title>
<link rel="STYLESHEET" type="text/css" href="/common/StyleSheet/Reports.css" /> <style> TD  {font-family: Verdana; font-size: 8pt; border-left: solid 0px black; border-right: solid 0px black;}    </style>
<script type="text/javascript" src="../../../cgi-bin/calendar/tableH.js"></script>
</head>
<body>
<img src="/common/images/logo.gif" border="0">
<br>
<br>
<b><span style="font-size: 12pt; font-variant: small-caps; ">New Starter List</span></b>
<br>Logged In As &quot;UserName&quot;<br>
<br>
<tableonMouseOver="javascript:trackTableHighlight(this.event,'FFFF66');"onMouseOut="javascript:highlightTableRow(0);" border="4" frame="border" width="80%" rules="none" cellspacing="6%" cellpadding="6%">
<th align="left">Date Started</th>
<th align="left">Name</th>
<th align="left">Initials</th>
<th align="left">Department</th>
<th align="left">Contact</th>
<th align="left">IT Completed?</th>
<th align="left">Supervisor Completed?</th>
<tr colspan="6"><td  align="left">25 Sep 2019</td>
<td  align="left"><a href="NewStarterInfo.php?id=3117">Joe Bloggs</a></td>
<td  align="left">JXBL</td>
<td  align="left">Team A</td>
<td  align="left">Manager 1</td>
<td  align="left">No</td>
<td  align="left">Yes</td></tr>
<tr colspan="6"><td  align="left">08 Jul 2019</td>
<td  align="left"><a href="NewStarterInfo.php?id=3149">Harry Bloggs</a></td>
<td  align="left">HXBL</td>
<td  align="left">Team B</td>
<td  align="left">Manager 2</td>
<td  align="left">No</td>
<td  align="left">Yes</td></tr>
<th align="left" colspan="7">72 starters</th>
</table>
</body>
</html>
"@

С $ a, установленным для содержимого страницы, проходите через него.

foreach($x in $a.split("<"))  # break it at the "<" that starts each line.
{
    if ($x.contains("NewStarterInfo.php") -eq $true) { write-host $x.split(">")[1] }
}

Это займет все строки в одной переменной (не массиве), найдет строки с именем человека и отобразит имя.

Если у вас действительно есть массив, вы можете опустить .split ("<") </strong> в операторе foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...