0

我想使用 Write-ObjectToSQL 模块在 SQL Server 表中导入文件信息和 MD5 哈希。如果可能的话,我正试图在一行中做到这一点。这是我所拥有的:

gci -file|select Directory,Name,Extension,Length,CreationTime,LastAccessTime,LastWriteTime,@{Name='MD5'; Expression={Get-FileHash $_ -Algorithm MD5|select Hash}}|Write-ObjectToSQL -Server ABC -Database PDOC -TableName Files

这是我在 SQL Server 中得到的:在此处输入图像描述

我没有得到 MD5 列或 Directory 列。这是获取会员信息:

PS C:\Users\pollusb> gci -file|select Directory,Name,Extension,Length,@{Name='MD5'; Expression={Get-FileHash $_ -Algorithm MD5|select Hash}}|gm

   TypeName: Selected.System.IO.FileInfo

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Directory   NoteProperty DirectoryInfo Directory=C:\Users\pollusb
Extension   NoteProperty string Extension=.pdoc
Length      NoteProperty long Length=65
MD5         NoteProperty Selected.System.Management.Automation.PSCustomObject MD5=@{Hash=C30CCC4447297D94FE10F54C18DBD5F9}
Name        NoteProperty string Name=345.pdoc

所以 SQL Server 将只导入不是对象的 NoteProperties。

现在,如果我们看看我在 Write-ObjectToSQL 之前得到了什么。我删除了时间列以获得更好的结果。

PS C:\Users\pollusb> gci -file|select Directory,Name,Extension,Length,@{Name='MD5'; Expression={Get-FileHash $_ -Algorithm MD5|select Hash}} |
ft -AutoSize

Directory        Name             Extension Length MD5
---------        ----             --------- ------ ---
C:\Users\pollusb 345.pdoc         .pdoc         65 @{Hash=C30CCC4447297D94FE10F54C18DBD5F9}
C:\Users\pollusb deletedRoute.txt .txt          51 @{Hash=DE585876A6249B9FDF176697F5D35EA4}
C:\Users\pollusb dir.txt          .txt       11815 @{Hash=77F3CE7F713966D4F8E39D12E1D77947}
C:\Users\pollusb open.ps1         .ps1         116 @{Hash=F5B0126D5B0A5040BE34FDC257ADD7F4}
C:\Users\pollusb pdoc.bat         .bat          34 @{Hash=E3630400A370F6D94ECE198407FDB151}

我的问题是有没有办法将 MD5 列转换为只有 MD5 结果而不是 @{Hash= 和结束 } AND 将 Directory 列转换为字符串?

4

1 回答 1

0

将目录名称转换为字符串而不是System.IO.DirectoryInfo,将 Select Directory 替换为自定义目录:

@{n='Directory'; e={$_.Directory -as [String]}}

获取文件哈希后,展开属性:

Get-FileHash $_ -Algorithm MD5 | select -ExpandProperty Hash

这将只返回实际的散列,而不是包含 HASH 属性的 MD5 对象。

添加新属性:

gci -file admin.bat | select @{n='Directory'; e={$_.Directory -as [String]}},
   Name,
   Extension,
   Length,
   @{Name='MD5'; Expression={Get-FileHash $_ -Algorithm MD5 | select -ExpandProperty Hash}
} | gm

这会为您提供一些字符串 NoteProperty:

Name        MemberType   Definition                                        
----        ----------   ----------                                        
Equals      Method       bool Equals(System.Object obj)                    
GetHashCode Method       int GetHashCode()                                 
GetType     Method       type GetType()                                    
ToString    Method       string ToString()                                 
Directory   NoteProperty System.String Directory=D:\                       
Extension   NoteProperty System.String Extension=.bat                      
Length      NoteProperty System.Int64 Length=2901                          
MD5         NoteProperty System.String MD5=876056EB083579DFF07E85015D4C0272
Name        NoteProperty System.String Name=admin.bat 
于 2016-02-08T04:09:10.393 回答