使用Python在Windows 7中创建快捷方式文件

时间:2014-11-18 04:16:17

标签: python windows-7 operating-system shortcut

是否有一种简单的方法可以在Python上使用Windows 7创建快捷方式?我在网上查了一下,但看起来并不那么简单。

我尝试过使用这种简单的方法:

hi = open("ShortcutFile.lnk", "w")
hi.close()

创建快捷方式文件。但是我如何编辑它所连接的链接。就像它会打开的文件一样?有人能帮我推动正确的方向吗?

7 个答案:

答案 0 :(得分:3)

很老,但我仍然希望发布一个答案来帮助任何可能有相同问题且需要代码示例的人。

首先,使用pip install pywin32下载pywin32或下载sourceforge二进制文件或pywin32 wheel文件以及pip install

import win32com.client
import pythoncom
import os
# pythoncom.CoInitialize() # remove the '#' at the beginning of the line if running in a thread.
desktop = r'C:\Users\Public\Desktop' # path to where you want to put the .lnk
path = os.path.join(desktop, 'NameOfShortcut.lnk')
target = r'C:\path\to\target\file.exe'
icon = r'C:\path\to\icon\resource.ico' # not needed, but nice

shell = win32com.client.Dispatch("WScript.Shell")
shortcut = shell.CreateShortCut(path)
shortcut.Targetpath = target
shortcut.IconLocation = icon
shortcut.WindowStyle = 7 # 7 - Minimized, 3 - Maximized, 1 - Normal
shortcut.save()

当我使用带有调试控制台的GUI时,我使用了WindowStyle,并且我不希望控制台一直弹出。我没有尝试过一个无法安慰的程序。

希望这有帮助!

答案 1 :(得分:0)

您当前正在做的是在您当前工作目录中的计算机上创建相当于空文件(在本例中为快捷方式)。

要使此文件成为可用的快捷方式,您需要将一些信息写入您正在创建的文件,告诉Windows该快捷方式文件将执行的操作。在这种情况下,这将是您希望它运行的快捷方式类型以及完成手头任务所需的任何其他参数。

我相信pywin32对于大多数这些任务都会派上用场:http://sourceforge.net/projects/pywin32/

如果您正在创建互联网快捷方式,可以在此页面上找到该示例(使用pywin32):http://www.blog.pythonlibrary.org/2010/01/23/using-python-to-create-shortcuts/

如果您要创建除互联网快捷方式之外的其他内容,则需要查找相应的Windows命令以查找要运行的快捷方式类型(例如,打开特定应用程序或特定文件)。

答案 2 :(得分:0)

如果您要寻找与Python 3兼容的独立于平台的版本,请查看swinlnk

from swinlnk.swinlnk import SWinLnk
swl = SWinLnk()
swl.create_lnk('W:\Foo\Bar', '/mnt/win_share/playground/Bar_winlink.lnk')

此python脚本基于C / Bash工具mslink

答案 3 :(得分:0)

您可以生成一个.bat文件,然后用正确的路径替换特定部分以进行空格操作。

管理带空格的Windows路径的正确方法是用“”包裹空格分隔的路径。例如,如果路径为

  

C:\Users\The Pc\Desktop

更正的版本是

  

C:\Users\"The Pc"\Desktop

我建议的解决方案是:

1-生成带有关键字的基本.bat文件,以替换为通过Python的正确路径。

2-使用os Python库根据当前环境构建路径。

3-使用Python打开base.bat文件,并逐行检查关键字以替换为先前在 steep 2 中生成的正确路径的关键字。

4-同时,我们检查并用te更正的路径替换了特殊关键字,我们在同一{{1}中用.bat文件的更新行编写了最终的base.bat文件}循环状态。

5-使用for Python库执行final.bat文件:


为了用代码解释它,我将使用一个个人屏幕录像机项目,它像这样:

1)我们的subprocess文件(请看我们的base.bat关键字):

================================================ =============

@回声关闭

set dir =%LOCALAPPDATA%\ srw

设置sof = srw.exe

set name = Grabador de Pantalla

ECHO设置objShell = WScript.CreateObject(“ WScript.Shell”)>> [r]

ECHO ficheroAccesoDirecto =“%USERPROFILE%\ Desktop \%name%.lnk” >> [r]

ECHO设置objAccesoDirecto = objShell.CreateShortcut(ficheroAccesoDirecto)>> [r]

ECHO objAccesoDirecto.TargetPath =“%dir%\%sof%” >> [r]

ECHO objAccesoDirecto.Arguments =“” >> [r]

ECHO objAccesoDirecto.Description =“%name%” >> [r]

ECHO objAccesoDirecto.HotKey =“ ALT + CTRL + G” >> [r]

ECHO objAccesoDirecto.IconLocation =“%dir%\ vista \ icon.ico” >> [r]

ECHO objAccesoDirecto.WindowStyle =“ 1” >> [r]

ECHO objAccesoDirecto.WorkingDirectory =“%dir%” >> [r]

ECHO objAccesoDirecto.Save >> [r]

ATTRIB + h + s [r]

START / B / WAIT [r]

删除/ Q / a h s [r]

退出

================================================ =============

2-现在,我们启动Python脚本。建立路径:

[r]

此代码生成间隔格式的路径:

  

C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

3-打开# Python Code import os, subprocess path = os.environ["USERPROFILE"]+"\\Desktop\\accsdirecto.vbs" user = os.environ["USERNAME"] path = path.replace('{}'.format(user), '"{}"'.format(user)) 文件并创建我们的base.bat文件:

final.bat

4-逐行检查# Python Code base = open("base", "r") bat = open("lnk.bat", "w") 文件,并用base.bat关键字替换我们正确的格式路径:

[r]

最后,我们收集了# Python Code for x in base: if "[r]" in str(x): x = x.replace("[r]", path) bat.write(x) 个文件:

.bat

5-使用# Python Code base.close() bat.close() Python库执行final.bat文件:

subprocess

我们的整个Python脚本如下所示:

# Python Code
subprocess.run("final.bat", stdout=subprocess.PIPE)

最后,生成的final.bat文件如下所示:

================================================ =============

@回声关闭

set dir =%LOCALAPPDATA%\ srw

设置sof = srw.exe

set name = Grabador de Pantalla

ECHO设置objShell = WScript.CreateObject(“ WScript.Shell”)>> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ECHO ficheroAccesoDirecto =“%USERPROFILE%\ Desktop \%name%.lnk” >> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ECHO设置objAccesoDirecto = objShell.CreateShortcut(ficheroAccesoDirecto)>> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ECHO objAccesoDirecto.TargetPath =“%dir%\%sof%” >> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ECHO objAccesoDirecto.Arguments =“” >> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ECHO objAccesoDirecto.Description =“%name%” >> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ECHO objAccesoDirecto.HotKey =“ ALT + CTRL + G” >> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ECHO objAccesoDirecto.IconLocation =“%dir%\ vista \ icon.ico” >> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ECHO objAccesoDirecto.WindowStyle =“ 1” >> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ECHO objAccesoDirecto.WorkingDirectory =“%dir%” >> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ECHO objAccesoDirecto.Save >> C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

ATTRIB + h + s C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

START / B / WAIT C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

删除/ Q / a h C:\ Users \“ El Computador” \ Desktop \ accsdirecto.vbs

退出

================================================ =============

最后,我让您a video在GNU / Linux Fedora主机下的Windos 7虚拟机环境中测试代码。希望对您有帮助。

-来自智利的问候。

答案 4 :(得分:0)

@Casey的答案使我步入正轨,但在弄清楚您还需要设置工作目录(在Windows属性中称为“开始于”)之前,我浪费了很多时间。 如果不这样做,快捷方式将起作用,但是您的应用程序将无法从同一文件夹中找到所需的文件。

这解决了我所有的问题:

            path_input = ''
            path_output = ''
            path_cwd = ''
            path_icon = ''

            shell = win32com.client.Dispatch("WScript.Shell")
            shortcut = shell.CreateShortCut(path_output)
            shortcut.Targetpath = path_input
            # shortcut.IconLocation = icon
            shortcut.Workingdirectory = path_cwd
            shortcut.WindowStyle = 1  # 7 - Minimized, 3 - Maximized, 1 - Normal
            shortcut.save()

答案 5 :(得分:0)

import os
import pathlib
import tempfile
import subprocess


def create_shortcut(shortcut_path, target, arguments='', working_dir=''):
    shortcut_path = pathlib.Path(shortcut_path)
    shortcut_path.parent.mkdir(parents=True, exist_ok=True)

    def escape_path(path):
        return str(path).replace('\\', '/')

    def escape_str(str_):
        return str(str_).replace('\\', '\\\\').replace('"', '\\"')

    shortcut_path = escape_path(shortcut_path)
    target = escape_path(target)
    working_dir = escape_path(working_dir)
    arguments = escape_str(arguments)

    js_content = f'''
        var sh = WScript.CreateObject("WScript.Shell");
        var shortcut = sh.CreateShortcut("{shortcut_path}");
        shortcut.TargetPath = "{target}";
        shortcut.Arguments = "{arguments}";
        shortcut.WorkingDirectory = "{working_dir}";
        shortcut.Save();'''

    fd, path = tempfile.mkstemp('.js')
    try:
        with os.fdopen(fd, 'w') as f:
            f.write(js_content)
        subprocess.run([R'wscript.exe', path])
    finally:
        os.unlink(path)


if __name__ == '__main__':
    create_shortcut(
        R'D:\xxx\hello_world.lnk',
        R'cmd.exe',
        R'/c "echo hello world && pause"',
    )

答案 6 :(得分:0)

有一个很好的开箱即用的 Python 解决方案,称为 pycrosskit。 它将在桌面或开始菜单上为您创建快捷方式,并且它适用于 Windows 和 Linux。

用法:

# Will Create shortcut 
# * at Desktop if desktop is True 
# * at Start Menu if start_menu is True

Shortcut(shortcut_name, exec_path, description,
     icon_path, desktop, start_menu)

# Will Delete shortcut
# * at Desktop if desktop is True 
# * at Start Menu if start_menu is True
Shortcut.delete(shortcut_name, desktop, start_menu)