2

我正在尝试将这个小的 .bat 脚本重写为 .py 文件,主要是为了练习,但我在让整个shutil模块对我有利时遇到了很多麻烦,似乎有很多方法可以使用副本,删除和目录创建。

但我的主要希望是有人可以将这些基本命令转换成一个工作脚本,这样我在处理其他脚本时就有了一些事情要做,并希望最终通过使用开始理解。

任何帮助都会很棒!:)

        SET USERNAME

:: Create new directory
md "C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data"   

COPY "Data" "C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data"
COPY "System32.lnk" "C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"


start /d "C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data" explorer.exe 
start /d "C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data" PnkBstrA.exe

启动问题的:

嘿 srry 重新发布,但脚本无法在脚本末尾启动两个应用程序,如果我只从脚本中取出启动命令并将它们放入如下所示的新脚本中。一旦第一个应用程序关闭,它就会启动第一个应用程序和下一个应用程序。

似乎它被设置为一个接一个地启动应用程序,导致它们不能同时运行。

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")


subprocess.call(['explorer.exe', data_dir])
subprocess.call(['PnkBstrA.exe'], cwd=data_dir)

编辑:我还需要将此编辑后的启动文件直接放在文件夹中,其中包含应该启动的 2 个程序以使其正常运行。

公开测试:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")

subprocess.Popen(['explorer.exe', data_dir])
subprocess.call(['PnkBstrA.exe'], cwd=data_dir)

编辑路径名:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")

subprocess.Popen(['explorer.exe', data_dir])
subprocess.call([r'C:\C:\Users\Spanjer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data\Data\PnkBstrA.exe'], cwd=data_dir)

编辑的路径名 CMD 读数:

C:\Users\Spanjer\Desktop>installtest2.py
Traceback (most recent call last):
  File "C:\Users\Spanjer\Desktop\installtest2.py", line 9, in <module>
    subprocess.call([r'C:\C:\Users\Spanjer\AppData\Roaming\Microsoft\Windows\Sta
rt Menu\Programs\Data\Data\PnkBstrA.exe'], cwd=data_dir)
  File "C:\Python27\lib\subprocess.py", line 524, in call
    return Popen(*popenargs, **kwargs).wait()
  File "C:\Python27\lib\subprocess.py", line 711, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 948, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

C:\Users\Spanjer\Desktop>

最终脚本 100% 工作:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")
dest_dir = os.path.join(data_dir, r'Data')
if not os.path.exists(data_dir):
    os.mkdir(data_dir)

if os.path.exists(dest_dir):
    shutil.rmtree(dest_dir)

shutil.copytree(r"Data", dest_dir)
shutil.copy(r"System32.lnk", menu_dir)
subprocess.Popen([r'C:\Users\Spanjer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data\Data\explorer.exe'], cwd=data_dir)
subprocess.call([r'C:\Users\Spanjer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data\Data\PnkBstrA.exe'], cwd=data_dir)
4

1 回答 1

2

试试下面的代码:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")
dest_dir = os.path.join(data_dir, r'Data')
if not os.path.exists(data_dir):
    os.mkdir(data_dir)

if os.path.exists(dest_dir):
    shutil.rmtree(dest_dir)

shutil.copytree(r"Data", dest_dir)
shutil.copy(r"System32.lnk", menu_dir)
subprocess.call(['explorer.exe', data_dir])
subprocess.call(['PnkBstrA.exe'], cwd=data_dir)

os.path.expandvars

os.path.expandvars(路径)

返回扩展环境变量的参数。$name 或 ${name} 形式的子字符串被环境变量 name 的值替换。格式错误的变量名称和对不存在变量的引用保持不变。

在 Windows 上,除了 $name 和 ${name} 之外,还支持 %name% 扩展。

操作系统.mkdir

os.mkdir(路径[,模式])

使用数字模式模式创建一个名为 path 的目录。默认模式为 0777(八进制)。在某些系统上,模式被忽略。在使用它的地方,当前的 umask 值首先被屏蔽掉。如果目录已经存在,则会引发 OSError。

shutil.copy

shutil.copy(src, dst)

将文件 src 复制到文件或目录 dst。如果 dst 是目录,则在指定目录中创建(或覆盖)与 src 具有相同基本名称的文件。许可位被复制。src 和 dst 是以字符串形式给出的路径名。

子进程调用

*subprocess.call(args, , stdin=None, stdout=None, stderr=None, shell=False)

运行 args 描述的命令。等待命令完成,然后返回 returncode 属性。

上面显示的参数只是最常见的参数,下面在常用参数中进行了描述(因此缩写签名中的符号有点奇怪)。完整的函数签名与 Popen 构造函数的签名相同 - 此函数将所有提供的参数直接传递到该接口。

于 2013-08-01T02:42:27.887 回答