使用批处理文件从win7下的命令行参数获取变音符号的文件路径

时间:2018-03-23 09:13:12

标签: python string windows encoding

我正在使用批处理文件来运行带有命令行参数的python脚本。 (是的,我知道python可以单独执行此操作,但我想了解为什么这不起作用) 一个参数是带有变音符号的文件路径(ä,ü,ö)。如果我使用Windows控制台并使用键盘编写路径一切正常。如果我尝试使用批处理文件(run_script.bat)并使用os.path.exists(filepath)对其进行测试,则会失败。我读了很多关于编码和解码的东西,但仍然没有解决方案。

示例:

我编写了以下代码并将其保存到名为parsepath.py的python模块中:

import os
import sys
def main():
    fn = sys.argv[1]
    if os.path.exists(fn):
        print os.path.basename(fn)
        # file exists
    else:
        print 'Could not read path {}'.format(fn)


if __name__ == '__main__':
    print 'starting'
    main()

我创建了一个名为c:\täterätä的文件夹。 在Windows控制台上我输入 c:\ python27 \ python.exe c:\ path \ to \ parsepath.py“c:\täterätä”

这导致

starting
tõterõtõ

Umlautä在控制台中的外观不同,但我猜这也是浏览器和控制台之间的编码问题。 无论如何,这是有效的。

如果我把它放在批处理文件中

"C:\python27\python.exe" "C:\path\to\parsepath.py" "c:\täteräta"

并运行批处理文件它不起作用。

starting
Could not read path c:\t+±ter+±ta

似乎我必须以某种方式解码。我使用了一个显示编码的编辑器,并将批处理文件保存为“utf-8”。

我尝试用

修改parsepath.py
...
fn = sys.argv[1]
fn = fn.decode('utf-8')
...

但没有运气。有错误信息。

在纯命令行上运行的其他编码也不能与批处理文件一起使用:

fn = fn.decode('mbcs')

批处理文件以某种方式更改了文件路径的字符,但我不知道以哪种方式。我发现cmd.exe的代码页是850.这也是sys.stdout.encoding所说的(cp850)。

如果我打印sys.argv,使用纯命令行输入的文件路径将是

['parsepath.py', 'c:\\t\xe4ter\xe4t\xe4']

如果我打印来自批处理文件的sys.argv中的文件路径:

['C:\\path\\to\\parsepath.py','c:\\t+\xf1ter+\xf1t+\xf1']

区别很明显:ä表示为\ xe4,但批处理文件产生+ \ xf1

???

0 个答案:

没有答案