我想生成一个HTML表,显示目录中一堆文件的filehash(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'cmdlet获取相对路径的简单方法:
dir | Resolve-Path -Relative
.\empty.txt
.\hello.txt
但我不能让它“适合”我的其余部分;我想他们可能是一个.NET函数以不同的方式做到这一点?或者是否有一些花哨的忍者使用括号,让我将这个调用压缩到'select-object'列表的cmdlet insde? p>
我尝试了这个:但它不起作用:
# NOTE: this code does not work !
PS > dir|get-filehash|select-object hash, (path|Resolve-Path -relative)
答案 0 :(得分:0)
在此方面取得了一些进展 - 但解决方案仍然不是很令人满意 - 因为我还需要控制标题(而不仅仅是'名称','值',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>