用 Python 判断 Windows 系统中某个文件是否可执行

329 阅读2分钟

在编写查找匹配某个模式的 %PATH% 中可执行文件工具时,需要判断路径中给定的文件名是否是可执行文件,特别是命令行脚本。

huake_00066_.jpg

解决方案

  1. 使用 is_executable 函数判断文件可执行性

    • Python 库 win32api 提供了一个 is_executable 函数,可以判断给定的文件是否是可执行文件。
    • 该函数在 Windows 系统中判断文件是否是可执行文件的主要依据是检查文件是否具有可执行权限,以及文件是否与某个可执行文件关联。
    • 对于具有可执行权限的文件,is_executable 函数会返回 True。对于没有可执行权限的文件,该函数会返回 False
    • 对于与某个可执行文件关联的文件,is_executable 函数还会检查该关联的可执行文件是否具有可执行权限。如果关联的可执行文件具有可执行权限,则该函数也会返回 True。否则,该函数会返回 False
  2. 根据文件扩展名判断文件可执行性

    • 对于具有可执行权限的文件,通常会具有一个可执行文件扩展名,例如 .exe.bat.cmd 等。
    • 可以使用 os.path.splitext 函数获取文件扩展名,然后判断该扩展名是否属于可执行文件扩展名的集合。
    • 如果文件的扩展名属于可执行文件扩展名的集合,则该文件通常是可执行文件。否则,该文件通常是不可执行文件。
  3. 根据文件内容判断文件可执行性

    • 对于一些没有可执行权限或没有可执行文件扩展名的文件,可以根据文件内容判断该文件是否是可执行文件。
    • 例如,对于 Python 脚本,可以判断文件内容是否以 #!/usr/bin/env python 开头,如果是,则该文件通常是可执行的 Python 脚本。

代码例子

import os
import win32api

def is_executable(path):
    """
    判断给定的文件是否可执行。

    :param path: 文件路径
    :return: True 表示可执行,False 表示不可执行
    """
    if os.path.isfile(path):
        # 检查文件是否具有可执行权限
        if os.access(path, os.X_OK):
            # 检查文件是否与某个可执行文件关联
            try:
                _, executable = win32api.FindExecutable(path)
                if executable and os.path.exists(executable):
                    # 检查关联的可执行文件是否具有可执行权限
                    if os.access(executable, os.X_OK):
                        return True
            except win32api.error:
                pass

        # 检查文件扩展名是否属于可执行文件扩展名的集合
        ext = os.path.splitext(path)[1].lower()
        if ext in ('.exe', '.bat', '.cmd', '.vbs', '.js', '.py', '.rb'):
            return True

        # 根据文件内容判断文件可执行性
        with open(path, 'r') as f:
            first_line = f.readline()
            if first_line.startswith('#!') and 'python' in first_line:
                return True

    return False

if __name__ == '__main__':
    path = 'path/to/file'
    if is_executable(path):
        print('The file is executable.')
    else:
        print('The file is not executable.')