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来说是一个新问题。在这样做时,请添加更多细节,特别是管道代码。