Powershell哈希表调用外部命令

时间:2018-12-27 04:58:33

标签: powershell hashmap hashtable

我有一个Powershell脚本,我计划安排它检查前十天带有日期的“事务”文件并按LastWriteTime进行排序,因为年初至今的数据一直在增长。周末没有任何变化,如果工作日没有变化,我知道服务器上的进程没有运行。

结果表具有“名称”,“大小(KB)”(将“长度”从字节转换为KB)和LastWriteTime列。我想添加一个“ MD5”列。我的计算机上有一个md5sum.exe命令。我想构造哈希表,以便它使用expression属性在$_.FullName字段内调用外部命令。

我发现了如何使用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日有不可原谅的重复数据。

1 个答案:

答案 0 :(得分:1)

要回答您的问题,可以从计算出的属性表达式字段中调用可执行文件,因为它对应于标准脚本块。

以下应该可以工作

$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")}}   

假设您可以从test"命令中看到echo,然后确认外部呼叫也对您有效。

关于md5sum.exe,请验证以下内容。

  • 确保使用正确的md5sum.exe路径。
  • 尝试从Windows命令行"c:\windows\md5sum.exe" "C:\windows\system32\notepad.exe"运行,并确保它产生所需的输出并且不会引发任何错误。
  • 尝试以管理员身份运行脚本

我将md5sum.exe复制到Windows文件夹,并且结果也为空。 正如我发现的那样,由于Powershell不会产生任何错误,因此在复制工具时,我没有复制其依赖项,因此该工具失败了。