94972


Windowsの標準コマンドであるSignToolをPythonから実行したいです。  
証明書を購入する必要があるコマンドなので、証明書を購入されていない環境では再現をするのは難しいかもしれませんが、私の環境では以下のようなコマンドをコマンドプロンプトに打ち込むとSignToolが動作します。

[code]

    set PATH="C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64";%PATH%
    
    signtool sign /debug /n "Test" /t http://time.certum.pl/ /fd sha256 /v "C:/Users/taichi/test.exe"
    
[/code]

上記の例では、"C:/Users/taichi/test.exe"のみにSignToolを実行しています。

実際に使用する際には、ディレクトリの階層内にある全てのファイルに一括でSignToolを実行したいと思い、Pythonから実行できないかと考えており、質問をさせて頂きました。

バッチファイルには詳しくないですが、バッチファイルで同様なことが出来るのであればそれでも構いません。

よろしくお願いいたします。


CC BY-SA 4.0
2023-05-24T13:00:18.633
94963
2023-05-25T06:08:27.733
34471
question
python windows batch-file
SignToolをPythonまたはバッチファイルから呼び出す方法


### pythonから呼び出す方法

`os.environ`で環境変数を一時的に変更してから`glob.glob`でファイルを列挙し、`subprocess.run`で任意のコマンドを実行します。  
※この環境変数変更は、このpythonコード実行中のみ反映されます。  
サンプルコードでは`subprocess.run`コマンドで`signtool verify`を実行していますので、必要なコマンドに読み替えてください。

**サンプルコード**

[code]

    import os
    import glob
    import subprocess
    
    os.environ['PATH'] = fr"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64;{os.environ['PATH']}" 
    
    # testフォルダの全ファイル(*)を列挙して処理する例
    for f in glob.glob("test/*"):
        if os.path.isdir(f):
            continue
        out_str = subprocess.run(["signtool", "verify", "/debug", f], capture_output=True, text=True).stdout
        print(out_str)
    
[/code]

**参考資料**

  * [os](https://docs.python.org/ja/3/library/os.html#os.environ)
  * [glob](https://docs.python.org/ja/3/library/glob.html?highlight=glob#glob.glob)
  * [subprocess](https://docs.python.org/ja/3/library/subprocess.html?highlight=process#subprocess.run)
  * [PythonでWindowsのPATHへ一時的に追加/書き換えを行う](https://qiita.com/MysteriousMonkey/items/5500dbc1fb77c7a6b6d2#%E3%82%B5%E3%82%AF%E3%83%83%E3%81%A8%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)
  * [pythonのsubprocessで標準出力を文字列として受け取る](https://qiita.com/yutake27/items/033155608d64eac0adc2)

### バッチファイルから呼び出す方法

`for %%f in ({対象パス}) do` で、ワイルドカードを使って対象パスに合致するファイルを列挙しています。  
こちらも`signtool verify`を必要なコマンドに読み替えてください。

**サンプルコード**

[code]

    set PATH="C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64";%PATH%
    
    rem testフォルダの全ファイル(*)を列挙して処理する例
    for %%f in (.\test\*) do (
      signtool verify /debug %%f
    )
    
[/code]

**参考資料**

  * [バッチファイルで繰り返し処理を使う(FOR)](https://www.javadrive.jp/command/bat/index9.html#section4)


CC BY-SA 4.0
2023-05-25T06:08:27.733
94972
2023-05-25T06:08:27.733
9820
94963
answer