Как создать HTML-таблицу файловых хешей - только с относительным путем?

Я хочу сгенерировать таблицу HTML, которая показывает файловый хеш (sha1) из набора файлов в каталоге; Я хочу, чтобы имена файлов были относительно моего текущего каталога - не абсолютные.

Я знаю, как сделать все разные биты отдельно, но я не могу понять, как их объединить.

Вот что у меня так далеко:

dir|get-filehash -Algorithm sha1

Что дает мне это:

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA1            DA39A3EE5E6B4B0D3255BFEF95601890AFD80709                               C:\temp\test\empty.txt
SHA1            88A5B867C3D110207786E66523CD1E4A484DA697                               C:\temp\test\hello.txt

Теперь я хочу только хэш и имя файла, поэтому я могу сделать это:

dir|get-filehash -Algorithm sha1|select-object hash, path

Что дает мне:

Hash                                                        Path
----                                                        ----
DA39A3EE5E6B4B0D3255BFEF95601890AFD80709                    C:\temp\test\empty.txt
88A5B867C3D110207786E66523CD1E4A484DA697                    C:\temp\test\hello.txt

Так что я могу вывести это в HTML-файл, как это:

(dir|get-filehash -Algorithm sha1|select-object hash, path)|ConvertTo-html|add-content output.htm

[игнорировать тот факт, что это работает правильно, только если выходной файл не существует].

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>HTML TABLE</title>
</head><body>
<table>
<colgroup><col/><col/></colgroup>
<tr><th>Hash</th><th>Path</th></tr>
<tr><td>DA39A3EE5E6B4B0D3255BFEF95601890AFD80709</td><td>C:\temp\test\empty.txt</td></tr>
<tr><td>88A5B867C3D110207786E66523CD1E4A484DA697</td><td>C:\temp\test\hello.txt</td></tr>
</table>

Так что это дает мне таблицу HTML; но значения PATH являются абсолютными.

Я знаю простой способ получения относительного пути с помощью командлета Resolve-Path:

dir | Resolve-Path -Relative

.\empty.txt
.\hello.txt

Но я не могу заставить его "вписаться" в остальную часть моего сценария; Я думаю, что они могут быть.NET-функцией, чтобы сделать это по-другому? Или есть какое-то причудливое использование скобок ниндзя, которое позволяет мне сжать этот вызов командлета insde из списка "select-object"?

Я попробовал это, но это не работает:

# NOTE: this code does not work !
PS > dir|get-filehash|select-object hash, (path|Resolve-Path -relative)

1 ответ

Достигнут некоторый прогресс в этом - но решение все еще не очень удовлетворительное - поскольку мне также нужен контроль над заголовками (а не просто "имя", "значение", которое предоставляет HashTable).

Я могу заставить эти заголовки работать в "таблице форматов", но все еще не в "convertto-html".

Вот код на данный момент:

function get-relative($infile) {
begin { $return_hash=@{} }
process {
    $relative_path=($_|resolve-path -Relative)
    $filehash=($_| Get-FileHash -Algorithm sha1).hash
    $return_hash.add($relative_path, $filehash)
}
end { return $return_hash }

}

И чтобы назвать это с форматером:

$table_format = @{Expression={$_.Name} ; Label="Filename"}, @{Expression={$_.Value} ; Label="CHECKSUM(SHA1)"}
dir|get-relative|format-table $table_format

Это дает:

Filename                                                                CHECKSUM(SHA1)                                                         
--------                                                                --------------                                                         
.\goodbye.txt                                                           DA39A3EE5E6B4B0D3255BFEF95601890AFD80709                               
.\hello.txt                                                             88A5B867C3D110207786E66523CD1E4A484DA697 

Но если я протолкну это через "convertto-html", возникнет странность. (Я думаю, это потому, что вывод 'format-table' на данный момент является просто строкой....)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>HTML TABLE</title>
</head><body>
<table>
<colgroup><col/><col/><col/><col/><col/><col/></colgroup>
<tr><th>ClassId2e4f51ef21dd47e99d3c952918aff9cd</th><th>pageHeaderEntry</th><th>pageFooterEntry</th><th>autosizeInfo</th><th>shapeInfo</th><th>
groupingEntry</th></tr>
<tr><td>033ecb2bc07a4d43b5ef94ed5a35d280</td><td></td><td></td><td></td><td>Microsoft.PowerShell.Commands.Internal.Format.TableHeaderInfo</td><
td></td></tr>
<tr><td>9e210fe47d09416682b841769c78b8a3</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>4ec4f0187cb04f4cb6973460dfe252df</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>cf522b78d86c486691226b40aa69e95c</td><td></td><td></td><td></td><td></td><td></td></tr>
</table>
</body></html>
Другие вопросы по тегам