Windows 提取批处理文件中的第二行输出

Windows 提取批处理文件中的第二行输出,windows,batch-file,Windows,Batch File,我的批处理文件正在生成输出: SHA1 hash of file E:/Test/test.zip: b04f3ee8f5e43fa3b162981b50bb72fe1acabb33 CertUtil: -hashfile command completed successfully. 我只想使用:b04f3ee8f5e43fa3b162981b50bb72fe1acabb33。 是否可以提取第二行并将其存储在变量中。未测试: for /f "skip=1 tokens=* delims="

我的批处理文件正在生成输出:

SHA1 hash of file E:/Test/test.zip:
b04f3ee8f5e43fa3b162981b50bb72fe1acabb33
CertUtil: -hashfile command completed successfully.
我只想使用:b04f3ee8f5e43fa3b162981b50bb72fe1acabb33。 是否可以提取第二行并将其存储在变量中。

未测试:

for /f "skip=1 tokens=* delims=" %%# in ('my command') do (
  set "second_line=%%#"
  goto :break
)
:break
echo %second_line%

但是你必须用你没有给出的命令来改变括号中的表达式。请注意,这将跳过空行。

将参数
返回stdout:true
传递到
bat
步骤以返回输出。 然后使用
String.readLines()
或正则表达式提取哈希。我个人会使用正则表达式,因为它更健壮。它为您提供了一种简单的方法来检测输出是否不是预期的格式(例如,当工具在将来的更新中更改输出时)

以下是两种方法的示例代码:

管道{
任何代理人
舞台{
阶段(“测试”){
台阶{
剧本{
def output=bat(returnStdout:true,脚本:“”\
@echo SHA1散列文件E:/Test/Test.zip:
@回波b04f3ee8f5e43fa3b162981b50bb72fe1acabb33
@echo CertUtil:-hashfile命令已成功完成。
'').trim()
//变量1:提取第二行
def hash1=output.readLines()[1]
echo“hash1:$hash1”
//变量2:使用正则表达式提取哈希
def regex=/SHA1文件的散列。*:\s*([a-f0-9]{40})/
def match=(输出=~regex)
如果(匹配){
def hash2=匹配[0][1]
echo“hash2:$hash2”
}
否则{
错误“无效的CertUtil输出”
}
}
}
}
}
}
输出:

hash1: b04f3ee8f5e43fa3b162981b50bb72fe1acabb33
hash2: b04f3ee8f5e43fa3b162981b50bb72fe1acabb33

根据您提供的输出,您需要的行是唯一不包含
字符的行。您应该能够通过管道将
certutil
命令输出通过
find.exe
及其
/V
选项轻松排除显示该字符的行

@“%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
要将其设置为变量,您可以将该命令添加到
For/F
循环中:

@For/F Delims^=%%G In(“%”中的%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
作为旁注,我的理解是CertUtil可以根据版本将SHA1结果输出为二十对,以空格分隔。如果在使用此类输出的系统上部署批处理文件,则仍然可以使用
For/F
循环获得40个字符的输出:

@For/F“Tokens=1-20”%%G In(“%%uuuuuuuuuu-AppDir\uuuuuuuu%certutil.exe”-HashFile“E:\Test\Test.zip”;“%%uuuuuuuuu-AppDir\uuuuuuuuuuu%find.exe”/V:”)Do@Set“SHA1=%G%%H%%I%%J%%K%%L%%M%%N%%O%%P%%Q%%R%%S%%T%%T%%U%%V%%W%%X%%Y%%

嗨,这对我来说很好用。但是,当我在curl中传递hash2命令以将其上载到artifactory时,它不起作用。“curl-u${USER}:${PASS}-H'X-Checksum-Sha1:${hash2}'-k-X PUT-te:/test/test.zip错误:groovy.lang.MissingPropertyException:没有这样的属性:类的hash2:groovy.lang.Binding您能提供一个解决方案吗。@Vidisha这对SO来说是一个新问题。在这样做时,请添加更多细节,特别是管道代码。