通过命令行和计划任务调用脚本的区别

1 投票
1 回答
617 浏览
提问于 2025-04-17 14:12

我现在正在尝试在我的电脑启动时执行一个用Python写的脚本(然后编译成exe文件)。这个脚本的功能很简单,就是下载一个文件并把它复制到我电脑上的指定位置。以下是我使用的代码的一部分:

def DownCopy(url,dst):
    import shutil

    """ Download and copy file """
    fn = os.path.basename(urllib.url2pathname(url))
    filename, unused = urllib.urlretrieve(url,fn)


    #if remote file change set exec permission
    if filename != url and not url.startswith('file:///'):
        os.chmod(filename, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)

    #check if target directory exist, if not create it
    dstDir = os.path.dirname(dst)
    if not os.path.exists(dstDir):
        os.mkdir(dstDir)

    #copy
    shutil.copy(filename, dst)

当我通过cmd命令行来执行这个脚本时,它可以正常工作:我的文件被下载了,文件夹也创建了,文件也被复制到里面。但是,如果我通过计划任务来调用这个脚本(权限是:系统),什么都没有发生,Last Result字段显示为0xfffff

所以,基本上,从cmd命令行调用这个脚本和通过计划任务调用有什么区别呢?我能注意到的唯一区别就是执行脚本的用户。通过cmd命令行,脚本是由当前用户执行的,而通过计划任务调用时则是由系统执行的。但我看不出为什么我的脚本在系统调用时会不工作……

我按照Caspar的建议进行了操作,得到了以下结果:

  • 计划任务的输出结果给了我一个[Errno 13] : Access Denied的错误。我检查了我想要复制文件的文件夹的权限,发现SYSTEM的权限是“所有权限”。以下是我的跟踪记录:

    Traceback (most recent call last):
      File "<string>", line 58, in <module>
      File "<string>", line 51, in Main
      File "<string>", line 30, in DownCopy
      File "Z:\home\user\workspace\repo_config_os\temp-DwIWiG\build\pyi.win32\pyinstaller_build_all\out08-PYZ.pyz\urllib", line 93, in urlretrieve
      File "Z:\home\user\workspace\repo_config_os\temp-DwIWiG\build\pyi.win32\pyinstaller_build_all\out08-PYZ.pyz\urllib", line 243, in retrieve
    IOError: [Errno 13] Permission denied: u'IzznoLo.exe'
    

所以问题似乎出在下载的部分。系统在网络方面是不是有什么限制?有没有办法让“他”可以访问?

1 个回答

0

我觉得有两种主要的方法。比较有效的方式是确保你能捕捉到错误信息,所以首先你需要把所有的输出重定向到一个文件里。

你可以尝试通过改变目标文件夹的权限或所有权来解决这个问题,放宽一些限制。你想选择哪种方式呢?

看起来这个程序 "IzNoLo.exe" 没有设置全局执行权限。老实说,我不知道这个程序具体是干什么的,但也许你知道,它是你提供的吗?

要设置这些[权限],你需要查看属性面板,特别是安全面板,确保所有用户的权限都设置好。

撰写回答