相关文章推荐
文武双全的刺猬  ·  error: Raw AIDL ...·  7 月前    · 

当文件路径中存在空格时,在命令行中运行exe文件的问题

1 人关注

我试图通过Windows 10的命令行,以Python或VBA代码,用Winrar自动归档一个目录中的文件夹。 考虑到可能有空格,我把所有路径都用引号括起来。
然而我在Python或VBA中都遇到了同样的错误。
"'C:/Program'未被识别为内部或外部命令、可操作程序或批处理文件。"
下面是一个未完成的Python代码尝试样本。

def folders_2_Winrar(source_path:str, archive_path:str, password:str='', winrar_path:str='"C:/Program Files/WinRAR/winrar.exe"')->None:
    import os
    folder_list = path_entries(source_path)['folders']  ## separate function that returns a list of folders in a directory
    for f in folder_list:
        rar = '"'+ archive_path + os.path.basename(f) +'.rar'+'"'
        f = r'"'+f+'\*.*"'
        cmd = winrar_path+' a -hp' + password + ' -ep1 ' + rar + ' ' + f 
        os.system(cmd)
# test the function
folders_2_Winrar("E:/Test/Source", "E:/Test\\Archive/","123")

有什么问题是我不能掌握的?

3 个评论
Try "C:/Progra~1/WinRAR/winrar.exe"
@r.ok 很好,你的建议起作用了!你能解释一下关于使用...~1机制吗? 谢谢
有趣的是,我没能找到关于它的很多信息,但这里有一个相关的网络档案知识库。 web.archive.org/web/20131206010029/http://support.microsoft.com/... . 基本上,它是任何超过8个字符或包含空格的短名称惯例。
python
vba
command-prompt
winrar
Leo Sam
Leo Sam
发布于 2021-12-24
2 个回答
r.ook
r.ook
发布于 2021-12-24
已采纳
0 人赞同

简单回答。使用完整路径的简略版本。【替换代码0

更长的答案。命令提示不喜欢路径之间的空格。 通常在提示本身中,你需要使用引号来表示包含空格的完整路径,或者使用~1(tilde符号)的速记惯例。

这里有一个 网络存档的微软知识库 我挖出来的,我把它作为一个副本放在这里,以防它被破坏。

Windows从长文件名中生成短文件名的方式是 以下方式。

  • Windows删除了文件名中任何无效的字符和空格。 从文件名中删除。无效的字符包括。替换代码1

  • 因为短文件名只能包含一个句号( . ),Windows 如果在文件名的最后一个句号后面有有效的非空格字符,Windows会从文件名中删除额外的句号。 字符的情况下,Windows会从文件名中删除额外的句号。

    Windows生成的短文件名是 Thisis~1.txt 。 名【替换代码4

    否则,Windows 忽略最后一个句子,而使用最后一个句子的旁边。例如 例如,Windows从长文件名 Thisis~1.789 生成短文件名 This is a really long filename.123.456.789. 。 长文件名【替换代码6

    如有必要,将文件名截断为六个字符,并附加一个 tilde( ~ )和一个数字。例如,创建的每个独特的文件名以 以" ~1 "结束。重复的文件名以" ~2 "、" ~3 "结束,依此类推。

  • Windows将文件名扩展名截断为三个字符或更少。

  • Windows将文件名和扩展名中的所有字符翻译为 大写字母。

    请注意,如果一个文件夹或文件名包含一个空格,但少于八个字符 少于八个字符,Windows仍然会创建一个短文件名。 如果你试图通过网络访问这样的文件或文件夹,这种行为可能会导致问题。 如果你试图通过网络访问这样的文件或文件夹,这种行为可能会导致问题。要解决这种情况,可以用一个 有效的字符,如下划线( _ ),来代替空格。如果你这样做 这样做,Windows就不会创建一个不同的短文件名。

    例如," Afile~1.doc "是由" A file.doc "生成的,因为 因为长文件名包含一个空格。

    没有短文件名从" A_file.doc "中产生,因为文件名中包含的字符少于8个,并且不包含空格。 因为文件名包含少于8个字符且不包含空格。

    短文件名" Alongf~1.txt "是由长文件名 "A long filename.txt "生成的。 生成的,因为长文件名 "A long filename.txt "包含八个以上的字符。 超过8个字符。

    替代答案:你可以尝试在你打算运行的 cmd 中添加引号。

    # using f-strings for Python 3.6+
    cmd = f'"{winrar_path}" a -hp {password} -ep1 {rar} {f}' 
    # or using good ol' format:
    cmd = '"{path}" a -hp {pw} -ep1 {file} {fl}'.format(path=winrar_path, pw=password, file=rar, fl=f)
        
  • 我添加了一个备选答案,因为 ~1 的记法并不完全完美。 使用引号也是一个更灵活的答案。
    请注意,{rar}和{f}也可能有空格。
    josephvictory
    josephvictory
    发布于 2021-12-24
    0 人赞同

    我没有完整的答案。但我可以通过删除for循环中的引号来使其运行。似乎字符串路径在有空格时必须用引号来封装。而当它没有的时候,则不需要。

    def folders_2_Winrar(source_path:str, archive_path:str, password:str='', winrar_path:str='"C:\Program Files\WinRAR\winrar.exe"')->None:
        import os
        folder_list = path_entries(source_path)['folders']  ## separate function that returns a list of folders in a directory
        for f in folder_list:
            rar = archive_path + os.path.basename(f) +'.rar'
            f = f+'\*.*'
            cmd = winrar_path+' a -hp' + password + ' -ep1 ' + rar + ' ' + f