使用批处理脚本

时间:2017-02-15 12:27:40

标签: windows batch-file for-loop cmd

我试图将Windows批处理脚本编写到

  1. 搜索目录中的第一个.pem证书
  2. 询问用户的密码
  3. 使用openSSL
  4. 使用此证书对目录中的所有.xml - 文件进行签名

    签名的名称应与.xml - 文件的名称相同,但后缀为.sig,例如XML: this.xml <=> signature: this.xml.sig

    用于签署文件的openSSL命令是

      

    openssl dgst -binary -sha512 -sign -out

    所以要创建签名&#34; this.xml.sig&#34; xml-file&#34; this.xml&#34;通过使用证书&#34; cert.pem&#34;我必须使用以下命令

      

    openssl dgst -binary -sha512 -sign cert.pem -out this.xml.sig this.xml

    然后,您将被要求输入应该用于签署XML的证书密码。

    所以我编写了以下脚本,但是当我双击.bat - 脚本时,我遇到了以下问题:

    • 黑色命令框被大大打开和关闭但没有任何反应。似乎脚本找不到在目录中找到.pem - 文件 - 但是有一个。
    • 当我更改第一个for循环以使用递归搜索(在/r之前添加.)时,它会在子目录中找到.pem - 文件并要求我输入密码,但在此之后关闭命令窗口并且不创建签名

    剧本:

    @echo off
    Rem placeholder for cert-file
    set cert=""
    
    for %%g in (*.pem) do (
      echo "Certificate found: " %%g
      set cert=%%g
      Rem exit loop as we found a cert-file
      goto :SignFiles
    )
    
    echo "No cert file found"
    exit
    
    :SignFiles
    Rem Ask user for Cert-Password
    set /p password="Please input cert-password: " 
    
    Rem debug
    echo %password%
    
    Rem sign all xml-files in directory
    for %%g in (*.xml) do (
      echo "Sign XML-File: " %%g
      Rem sign file and pass saved password for signing
      openssl dgst -binary -sha512 -out %%g.sig -sign=%cert% %%g < %password%
    )
    
    pause
    exit
    

    任何人都可以帮助我让脚本按预期运行吗?

    修改 更新了将评论从::添加到Rem的脚本。行为保持不变。黑色命令框无需打开和关闭,无需输入密码和/或创建签名

    EDIT2 删除了foor循环中的.。现在循环正在运行但没有完全正常工作。在尝试执行openssl命令时,我得到System can not find the file。为了调试这个,我添加了

    echo %cert% > cert.txt
    echo %%g > file.txt
    

    到第二个foor循环,看到证书和xml文件的名称被正确写入cert.txt / file.txt。但仍然没有创建签名。

1 个答案:

答案 0 :(得分:1)

for . %%g ...

应该是

for %%g ...

您的代码会产生语法错误,如果您只需单击它就可以运行批处理,从而导致窗口关闭。要查看语法错误,您需要从提示符运行批处理。

如果您通过单击批处理批处理,则不会看到您故意生成的消息,因为echo后面的命令是exit。可能在退出之前插入pause命令以确保看到该消息 - 或者将消息重定向到文件...