生成某种类型的文件名列表,其哈希值逗号用bat或ps1脚本分隔

问题描述

我正在尝试使用bat脚本或ps1脚本获取csv中具有哈希值(SHA256)的.zip类型的文件列表。

在蝙蝠脚本中,我已经:

@echo off
set "zipfiles=C:\Location\*.zip"
for %%f in (%zipfiles%) do (
set filename=%%f
set hash=certutil -hashfile "%%f" SHA256
echo %filename%,%hash% >> C:\Location\Report\listofFiles.csv
)

我在csv中的结果是:

SHA256 hash of C:\Location\File 00001.zip:
61b22633916abe04a9024f852f5d873b79635cff75ffc8a36377faa59593369a
CertUtil: -hashfile command completed successfully.
SHA256 hash of C:\Location\File 00002.zip:
e9cdc01a70ce0f2f1fbd8b9e94530fac105609d918858c944d1b8ee3a50764ad
CertUtil: -hashfile command completed successfully.
SHA256 hash of C:\Location\File 00003.zip:
68b17a9d0d98dd64f3c6c5b29e5cd304a6397d21f24e3087723ccad9f6f77c58
CertUtil: -hashfile command completed successfully.

csv中所需的结果是:

File 00001.zip,61b22633916abe04a9024f852f5d873b79635cff75ffc8a36377faa59593369a
File 00002.zip,e9cdc01a70ce0f2f1fbd8b9e94530fac105609d918858c944d1b8ee3a50764ad
File 00003.zip,68b17a9d0d98dd64f3c6c5b29e5cd304a6397d21f24e3087723ccad9f6f77c58 

到目前为止,在ps1脚本中

param(
      [string] $padstaging = 'C:\Location\',[string] $padreport = 'C:\Location\Report',[string] $output = $padreport+'listofFiles.csv'
      )

Get-Childitem -Path $padstaging -Recurse | where {!$_.PSIsContainer} | select-object FullName | export-csv -path $output -Delimiter ',' -notypeinformation;

但是如何将文件添加输出中?

解决方法

您的第一个问题是缺少delayed expansion,第二个问题是您无法像尝试过的那样将命令的输出分配给变量。您需要another for loop。但是您可以通过不使用换行符的小技巧来避免这两个问题:

(for %%f in (%zipfiles%) do (
  <nul set /p =%%f,certutil -hashfile "%%f" SHA256|find /v ":" || echo empty file
))> "C:\Location\Report\ListOfFiles.csv"

如果文件为空(零字节),则certutil无用,并产生错误。在这种情况下,|| echo empty file回显一个字符串(当然,CRLF回显该行)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...