python 打开当前目录所有文件(excel等),解决文件名包含空格问题,并用pyinstaller打包成exe

cmd窗口执行命令 start xxx.file  时如果文件名带空格解决办法, 中间多打两个双引号:

start " " "xx xx   xxx.xls"

import os


file_path = os.path.dirname(os.path.abspath(__file__))
ret = os.listdir(file_path)
for item in ret:
    temp_file = os.path.join(file_path,item)
    if os.path.isfile(temp_file):
        os.system('start " " "%s'%temp_file)

打包文件:

1. 安装pip install pyinstaller,然后执行命令

pyinstaller -F -w  "C:/xxxx://xxxx.xxx"

 

 

<think>嗯,用户的问题是关于如何在BAT脚本中获取Python脚本的名字,然后把这个名字填写到pyinstaller使用的version_info.txt文件中的EXE名字部分。我需要一步一步来思考怎么解决这个问题。 首先,用户可能有一个BAT脚本,也就是批处理文件,用来自动化一些任务。他们想要在这个BAT脚本里动态地获取Python脚本的文件名,比如当前目录下的某个.py文件,然后用这个文件名作为生的可执行文件的名字。同时,这个EXE的名字还需要被写入到version_info.txt里,供pyinstaller使用。 那我应该怎么在BAT脚本里获取Python脚本的名字呢?假设用户每次只有一个.py文件在目录中,或者有特定的命名规则。比如,用户可能希望获取最新的.py文件,或者指定的某个文件。不过用户的问题里没有说明具体情况,可能需要假设是当前目录下的某个特定文件,或者通过参数传递。 假设用户希望处理当前目录下的一个特定的.py文件,比如main.py,或者通过拖放文件到BAT上来获取文件名。或者可能BAT脚本需要遍历当前目录,找到.py文件,然后取第一个。这种情况下,BAT脚本可能需要使用通配符来获取.py文件的名字。 比如,在BAT中,可以使用以下命令来获取.py文件的名称: for %%f in (*.py) do set "SCRIPT_NAME=%%~nf" 这里,%%~nf表示不带扩展名的文件名。所以,如果有多个.py文件,这个循环会遍历所有,但最后只会保留最后一个文件名。这可能有问题,如果目录下有多个.py文件的话。用户可能需要确保目录下只有一个.py文件,或者指定具体的文件名。 然后,用户需要将这个SCRIPT_NAME变量写入到version_info.txt中的EXE名字部分。version_info.txt的结构通常是这样的: VSVersionInfo( ffi=FixedFileInfo( ... ), kids=[ StringFileInfo( ... StringTable( ... [u'OriginalFilename', u'OriginalFilename.exe'], ... ) ), VarFileInfo([VarStruct(u'Translation', [0, 1200])]) ] ) 用户需要修改的是OriginalFilename.exe这一部分,替换动态获取的SCRIPT_NAME.exe。所以,BAT脚本需要处理version_info.txt,将OriginalFilename.exe替换%SCRIPT_NAME%.exe。 但version_info.txt可能是一个模板文件,需要动态生。或者用户可能希望直接在现有的version_info.txt中替换这一行。这时候,可以使用BAT脚本中的字符串替换功能。 例如,使用powershell或者sed工具来替换文件中的内容。不过BAT本身处理文本替换比较麻烦,可能需要使用for循环逐行读取文件,并替换特定内容。 或者,用户可能有一个模板version_info.txt,其中OriginalFilename.exe是一个占位符,然后在BAT脚本中用SCRIPT_NAME替换它。例如: 在version_info.txt中有一行: [u'OriginalFilename', u'%EXE_NAME%.exe'], 然后在BAT脚本中,使用: set EXE_NAME=%SCRIPT_NAME% powershell -Command "(Get-Content version_info.txt) -replace '%%EXE_NAME%%', '%EXE_NAME%' | Set-Content version_info.txt" 不过这里要注意转义百分号,可能需要使用双百分号,或者在powershell中用不同的方式处理。 或者,用户可能需要动态生整个version_info.txt文件,而不是替换其中的一部分。例如,使用echo命令将内容写入到version_info.txt,其中EXE名字部分使用变量。 不过version_info.txt的结构比较复杂,可能包含多个部分,直接生可能容易出错,所以替换占位符可能更可行。 假设用户有一个模板文件version_info_template.txt,里面包含: [u'OriginalFilename', u'__EXE_NAME__.exe'], 然后在BAT脚本中,将__EXE_NAME__替换为实际的SCRIPT_NAME。 所以,整体步骤可能是: 1. 在BAT脚本中获取Python脚本的文件名(不带扩展名)。 2. 将这个文件名保存到变量中。 3. 使用这个变量替换version_info.txt中的占位符,生最终的version_info.txt。 4. 使用pyinstaller命令,指定version_info.txt来生EXE文件。 现在,具体怎么在BAT脚本中实现这些步骤呢? 首先,获取Python脚本的名字。假设用户处理的是当前目录中的唯一一个.py文件: for %%i in (*.py) do set "SCRIPT_NAME=%%~ni" 这会将第一个.py文件的名称(不带扩展名)赋值给SCRIPT_NAME变量。但如果有多个.py文件,这可能会出错,所以可能需要处理这种情况。但用户可能已经知道这点,或者确保只有一个文件。 然后,替换version_info.txt中的占位符。假设模板中有占位符如%EXE_NAME%,或者使用其他标记,比如__EXE_NAME__。 使用BAT脚本中的字符串替换,可以逐行读取模板文件,并将占位符替换为实际的名称。例如: (for /f "tokens=*" %%a in (version_info_template.txt) do ( set "line=%%a" setlocal enabledelayedexpansion set "line=!line:__EXE_NAME__=%SCRIPT_NAME%!" echo !line! endlocal )) > version_info.txt 这会将模板中的__EXE_NAME__替换为实际的脚本名称,并生新的version_info.txt。 然后,使用pyinstaller命令,如: pyinstaller --version-file version_info.txt -n %SCRIPT_NAME% script.py 不过这里可能需要注意,pyinstaller的-n参数已经指定了EXE的名称,但version_info.txt中的OriginalFilename也应该一致。或者,可能用户希望version_info中的OriginalFilename和生EXE名称一致,所以可能需要同时使用这两个地方。 或者,可能用户只需要在version_info.txt中设置OriginalFilename,而pyinstaller的可执行文件名由其他参数决定。需要确认pyinstaller的参数使用。 例如,pyinstaller的--name参数指定生exe名称,而version_info.txt中的OriginalFilename可能不影响exe文件名,而是影响文件属性中的“原始文件名”字段。因此,用户可能需要同时设置这两个地方,或者他们可能更关注文件属性中的名称,而不是实际的exe文件名。 不过根据用户的问题,他们可能希望将Python脚本的名字同时作为生exe文件名和version_info中的OriginalFilename。所以,在BAT脚本中,可能需要同时处理这两个地方。 综上,整个BAT脚本的大致流程如下: 1. 获取当前目录下的Python脚本文件名(不带扩展名)。 2. 将该文件名赋值给变量,比如SCRIPT_NAME。 3. 使用该变量替换version_info.txt中的占位符,生正确的version_info内容。 4. 运行pyinstaller命令,使用该SCRIPT_NAME作为exe的名字,并指定version_info.txt。 不过具体替换version_info.txt的方法需要根据模板的情况来处理。例如,如果version_info.txt中需要设置OriginalFilename字段,那么替换该字段的值即可。 现在,用户的问题可能更关注如何获取Python脚本名,并填入version_info.txt中的正确位置。因此,可能需要给出一个具体的示例,展示如何编写BAT脚本,包括如何获取脚本名,如何修改version_info.txt,然后调用pyinstaller。 可能的示例代码: @echo off setlocal enabledelayedexpansion REM 获取当前目录下第一个.py文件的名称(不含扩展名) for %%i in (*.py) do ( set "SCRIPT_NAME=%%~ni" goto :next ) :next REM 替换version_info.txt中的占位符为脚本名 ( for /f "tokens=*" %%a in (version_info_template.txt) do ( set "line=%%a" set "line=!line:__EXE_NAME__=%SCRIPT_NAME%!" echo !line! ) ) > version_info.txt REM 使用pyinstaller打包,指定生exe名称和version文件 pyinstaller --version-file version_info.txt --name "%SCRIPT_NAME%" "%SCRIPT_NAME%.py" endlocal 这里,假设version_info_template.txt中包含类似[u'OriginalFilename', u'__EXE_NAME__.exe'],的行,BAT脚本会将__EXE_NAME__替换为实际的脚本名。 需要注意的几个问题: 1. 如果有多个.py文件,for循环会取第一个,然后通过goto跳出循环,确保只取第一个文件的名称。 2. version_info_template.txt是用户准备好的模板文件,其中包含需要替换的占位符。 3. 生的version_info.txt将被pyinstaller使用。 4. pyinstaller的--name参数指定生exe名称,同时可能也需要在version_info.txt中设置OriginalFilename字段,保持两者一致。 不过,用户可能只需要设置其中一个,或者两者都需要。需要根据实际情况调整。 另外,如果用户没有version_info.txt模板,而是希望在BAT脚本中动态生整个version_info.txt的内容,可能需要更复杂的处理,比如使用echo命令逐行写入内容,其中EXE名称部分使用变量。例如: echo VSVersionInfo( > version_info.txt echo ffi=FixedFileInfo( >> version_info.txt ...其他行... echo [u'OriginalFilename', u'%SCRIPT_NAME%.exe'], >> version_info.txt ...其他行... 但这样写起来比较麻烦,容易出错,特别是格式和空格需要严格匹配。因此,使用模板替换的方法可能更可靠。 总结,用户的问题需要结合BAT脚本获取.py文件名,替换version_info.txt中的占位符,然后运行pyinstaller。关键点在于如何动态处理这些步骤,并确保替换正确。</think>在BAT脚本中动态获取Python脚本名称,并生PyInstaller所需的`version_info.txt`,可参考以下步骤: ### 1. **获取Python脚本名称** 在BAT脚本中遍历当前目录的`.py`文件,获取第一个文件名(不含扩展名): ```bat @echo off setlocal enabledelayedexpansion REM 获取第一个.py文件的名称(无扩展名) for %%i in (*.py) do ( set "SCRIPT_NAME=%%~ni" goto :process ) :process ``` ### 2. **生或替换`version_info.txt`** 假设你有一个模板文件`version_info_template.txt`,内容如下(注意`__EXE_NAME__`为占位符): ```python VSVersionInfo( ffi=FixedFileInfo(...), kids=[ StringFileInfo( StringTable( ... [u'OriginalFilename', u'__EXE_NAME__.exe'], ... ) ), VarFileInfo(...) ] ) ``` 在BAT中替换占位符并生正式文件: ```bat REM 动态替换占位符并生version_info.txt ( for /f "tokens=*" %%a in (version_info_template.txt) do ( set "line=%%a" set "line=!line:__EXE_NAME__=%SCRIPT_NAME%!" echo !line! ) ) > version_info.txt ``` ### 3. **调用PyInstaller打包** 使用动态生的名称和版本信息文件: ```bat REM 执行打包命令 pyinstaller --version-file version_info.txt --name "%SCRIPT_NAME%" "%SCRIPT_NAME%.py" ``` ### 完整BAT脚本示例 ```bat @echo off setlocal enabledelayedexpansion REM 步骤1:获取Python脚本名称 for %%i in (*.py) do ( set "SCRIPT_NAME=%%~ni" goto :generate_version_info ) :generate_version_info REM 步骤2:生version_info.txt ( for /f "tokens=*" %%a in (version_info_template.txt) do ( set "line=%%a" set "line=!line:__EXE_NAME__=%SCRIPT_NAME%!" echo !line! ) ) > version_info.txt REM 步骤3:调用PyInstaller pyinstaller --version-file version_info.txt --name "%SCRIPT_NAME%" "%SCRIPT_NAME%.py" endlocal ``` ### 注意事项 - **多个.py文件**:若目录下有多个`.py`文件,上述脚本会取第一个文件。建议明确指定脚本名(如`main.py`)。 - **版本信息模板**:需提前准备`version_info_template.txt`并确保占位符(如`__EXE_NAME__`)正确。 - **文件属性**:`OriginalFilename`影响EXE文件的属性信息,而`--name`参数控制输出文件名,二者通常保持一致。 通过此方法,可动态将Python脚本名注入到版本信息文件PyInstaller的可执行文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值