将 NoteProperty 和计算列对象转换为字符串
Transform a NoteProperty and computed column object into a string
我想使用 Write-ObjectToSQL 模块在 SQL 服务器 table 中导入文件信息和 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 服务器中得到的:
我没有得到 MD5 列和目录列。这是 Get-Member 信息:
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 服务器将只导入不是对象的 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= 和结束符 } 并将目录列转换为字符串?
将目录名称转换为字符串而不是 System.IO.DirectoryInfo
,将 Select 目录替换为自定义目录:
@{n='Directory'; e={$_.Directory -as [String]}}
获得文件哈希后,展开 属性:
Get-FileHash $_ -Algorithm MD5 | select -ExpandProperty Hash
这将 return 只是实际的散列,而不是包含散列的 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
这会为您提供一些 String 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
我想使用 Write-ObjectToSQL 模块在 SQL 服务器 table 中导入文件信息和 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 服务器中得到的:
我没有得到 MD5 列和目录列。这是 Get-Member 信息:
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 服务器将只导入不是对象的 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= 和结束符 } 并将目录列转换为字符串?
将目录名称转换为字符串而不是 System.IO.DirectoryInfo
,将 Select 目录替换为自定义目录:
@{n='Directory'; e={$_.Directory -as [String]}}
获得文件哈希后,展开 属性:
Get-FileHash $_ -Algorithm MD5 | select -ExpandProperty Hash
这将 return 只是实际的散列,而不是包含散列的 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
这会为您提供一些 String 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