Powershell哈希表调用外部命令
我有一个powershell脚本,我计划检查前十天有日期的“事务”文件,并按LastWriteTime排序,因为年初至今的数据总是在增长。周末没有变化,如果一周内没有变化,我知道服务器上的进程没有运行 生成的表包含列“Name”、“Size(KB)”(将“Length”从字节转换为KB)和LastWriteTime。我想添加一个“MD5”列。我的计算机上有一个md5sum.exe命令。我希望构造哈希表,以便它使用Powershell哈希表调用外部命令,powershell,hashmap,hashtable,Powershell,Hashmap,Hashtable,我有一个powershell脚本,我计划检查前十天有日期的“事务”文件,并按LastWriteTime排序,因为年初至今的数据总是在增长。周末没有变化,如果一周内没有变化,我知道服务器上的进程没有运行 生成的表包含列“Name”、“Size(KB)”(将“Length”从字节转换为KB)和LastWriteTime。我想添加一个“MD5”列。我的计算机上有一个md5sum.exe命令。我希望构造哈希表,以便它使用$\uuU1.FullName属性调用表达式字段中的外部命令 我找到了如何使用PS计
$\uuU1.FullName
属性调用表达式
字段中的外部命令
我找到了如何使用PS计算MD5校验和的方法,并将其作为一个线性函数集成到新列的表达式中。我仍然想知道是否可以在哈希表中调用外部命令
以下是原始代码:
$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日都有不可原谅的重复数据。要回答您的问题,可以从计算属性表达式字段调用可执行文件,因为这对应于标准脚本块
以下几点应该有效
$md5exepath = "C:\Program Files\Git\usr\bin\md5sum.exe"
#Make sure you have a few png on your desktop or change the get-childitem so it matches something.
$Items = get-childitem -Path "$($Env:USERPROFILE)\desktop" -Filter '*.png' | Select -First 5
$Items | Select Name,
@{n='md5';e={(& $md5exepath $_.FullName).split(' ')[0]}},
@{n='test';e={(& 'cmd' "/c echo test")}}
假设您可以从echo
命令中看到test“
,那么它会确认外部调用也适用于您
关于md5sum.exe,请验证以下内容
- 确保使用md5sum.exe的正确路径
- 尝试从windows命令行运行:
“c:\windows\md5sum.exe”“c:\windows\system32\notepad.exe”
,并确保它生成所需的输出,并且不会引发任何错误
- 尝试以管理员身份运行脚本
我将md5sum.exe复制到Windows文件夹,结果也是空的。
我发现,由于Powershell没有产生任何错误,因此在我复制该工具时,我没有复制它的依赖项,因此它失败了。我不太清楚到底是什么问题,请原谅我没有抓住要点。如果需要,可以在计算属性表达式字段中调用外部命令。exp这个字段是一个scriptblock,所以你可以做你想做的事情,包括调用一个外部实用程序。我有点把它埋在开头。我找到了如何在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 sum和以空格分隔的文件名,就可以使用{name='md5';expression={(md5sum.exe$\uuz.Fullname)。split('[0]}
从PSv4+您也可以使用{name='md5';expression={(Get-FileHash-Algorithm md5$551;.FullName).Hash}
我使用了&
,但我没有用引号括住每个参数。也许这就是问题所在。