【发布时间】:2019-05-25 04:21:47
【问题描述】:
我有一个 powershell 脚本,我计划检查前十天的日期“事务”文件并按 LastWriteTime 排序,因为年初至今的数据一直在增长。周末没有变化,如果一周内没有变化,我知道服务器上的进程没有运行。
生成的表包含列“名称”、“大小 (KB)”(将“长度”从字节转换为 KB)和 LastWriteTime。我想添加一个“MD5”列。我的电脑上有一个 md5sum.exe 命令。我想构建哈希表,以便它使用$_.FullName 属性在expression 字段中调用外部命令。
我从this post 找到了如何使用 PS 本地计算 MD5 校验和,并且我已将其作为单行代码集成到新列的 expression 值中。不过,我仍然想知道是否可以在哈希表中调用外部命令。
这是原始代码:
$LOOKBACKXDAYS=( Get-Date ).AddDays(-10)
$SrcMachine='TheServerInQuestion'
if( -not ( Test-Path -Path \\$SrcMachine\C$ ) ) { net use \\$SrcMachine\C$ /user:mydomain\administrator }
Get-ChildItem -Path \\$SrcMachine\C$\temp transactions*.tab | `
Where-Object {$_.LastWriteTime -ge $LOOKBACKXDAYS } | `
Select-Object `
-Property `
Name , `
@{name='Size (KB)'; expression={[string]([math]::ceiling($_.Length / [math]::pow(2, 10)))}} , `
LastWriteTime | `
Sort-Object `
-Property `
'Size (KB)', `
LastWriteTime, `
Name | `
Out-Host
Write-Host -ForegroundColor Green "`n`nAll Done!`n`n"
pause
它会产生如下所示的输出:
Name Size (KB) LastWriteTime
---- --------- -------------
transactions for 12172018.tab 13783 2018-12-17 12:05:04
transactions for 12182018.tab 13824 2018-12-18 12:05:06
transactions for 12192018.tab 13869 2018-12-19 12:05:16
transactions for 12202018.tab 13901 2018-12-20 12:05:14
transactions for 12212018.tab 13901 2018-12-21 12:05:12
transactions for 12222018.tab 13931 2018-12-22 12:05:16
transactions for 12232018.tab 13931 2018-12-23 12:05:12
transactions for 12242018.tab 13954 2018-12-24 12:05:14
transactions for 12252018.tab 13954 2018-12-25 12:05:16
transactions for 12262018.tab 14001 2018-12-26 12:05:26
这是生成小写字母的修改代码,连字符删除了 MD5 校验和,如果一周中的某一天是周末,我添加了一个显示“Y”的列,因此我可以忽略相同的文件。我也改变了一些其他的东西。
$LOOKBACKXDAYS=( Get-Date ).AddDays(-10)
$SrcMachine='TheServerInQuestion'
if( -not ( Test-Path -Path TabFiles:\temp ) ) {
New-PSDrive `
-PSProvider FileSystem `
-Name TabFiles `
-Root \\TheServerInQuestion\C$ `
-Credential mydomain\administrator
}
Get-ChildItem -Path TabFiles:\temp transactions*.tab | `
Where-Object {$_.LastWriteTime -ge $LOOKBACKXDAYS } | `
Select-Object `
-Property `
Name , `
@{name='Size (KB)'; expression={[string]([math]::ceiling($_.Length / [math]::pow(2, 10)))}} , `
@{name='MD5'; expression={ [System.BitConverter]::ToString($(New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider).ComputeHash([System.IO.File]::ReadAllBytes($_.FullName))).replace('-','').ToLower() }}, `
@{name='Is Weekend'; expression={ $( if ($_.LastWriteTime.dayofweek -match 'Saturday|Sunday'){return 'Y'} else{return ''} ) } }, `
LastWriteTime | `
Sort-Object `
-Property `
'Size (KB)', `
LastWriteTime, `
Name | `
Format-Table
Write-Host -ForegroundColor Green "`n`nAll Done!`n`n"
pause
这是上面脚本的输出:
Name Size (KB) MD5 Is Weekend LastWriteTime
---- --------- --- ---------- -------------
transactions for 12172018.tab 13783 e825b1a58954203da9f8a16c454d9441 2018-12-17 12:05:04
transactions for 12182018.tab 13824 4de56734ceacd02db11bdd8a3dcdc628 2018-12-18 12:05:06
transactions for 12192018.tab 13869 1e4401afd2734004da372bfcf1e90395 2018-12-19 12:05:16
transactions for 12202018.tab 13901 49b1c5e29ea4da7e8a7a72bf610cecd6 2018-12-20 12:05:14
transactions for 12212018.tab 13901 49b1c5e29ea4da7e8a7a72bf610cecd6 2018-12-21 12:05:12
transactions for 12222018.tab 13931 36e40a546c6049e550b0feac9aa7adc7 Y 2018-12-22 12:05:16
transactions for 12232018.tab 13931 36e40a546c6049e550b0feac9aa7adc7 Y 2018-12-23 12:05:12
transactions for 12242018.tab 13954 9c97ccf81ce4cbb583fff348a739cc66 2018-12-24 12:05:14
transactions for 12252018.tab 13954 9c97ccf81ce4cbb583fff348a739cc66 2018-12-25 12:05:16
transactions for 12262018.tab 14001 ad18d544c8dea1d3d9cf1512c4a772e4 2018-12-26 12:05:26
周末和平安夜到圣诞节有可忽略的重复数据,但20日和21日有不可原谅的重复数据。
【问题讨论】:
-
我不确定到底是什么问题,如果我错过了重点,请原谅我。如果需要,可以在计算的属性表达式字段中调用外部命令。表达式字段是一个脚本块,因此您可以做任何您想做的事情,包括调用外部实用程序。
-
我把它埋在了开头。我找到了如何在 PS 中本地计算文件的 MD5 校验和,但我说我没有。 “不过,我仍然想知道是否可以在哈希表中调用外部命令。”我尝试了几种不同的调用md5sum.exe的方法,包括
expression={ & c:\windows\md5sum.exe $_.FullName }、expression={ & ( c:\windows\md5sum.exe $_.FullName ) }、expression={ & $( c:\windows\md5sum.exe $_.FullName ) }等。 -
不知道为什么它不适合你。我试过这个
$h=@{name='aa'; expression=md5sum.exe .\file}效果很好 -
提供的你的 md5sum版本输出md5总和和用空格分隔的文件名使用
@{Name='MD5';Expression={(md5sum.exe $_.Fullname).split(' ')[0]}} -
从 PSv4+ 你也可以使用
@{Name='MD5';Expression={(Get-FileHash -Algorithm md5 $_.FullName).Hash}}
标签: powershell hashmap hashtable