Mapping Window Drives Python: Win cmd Line 需要输入时如何处理

Mapping Window Drives Python: How to handle when the Win cmd Line needs input

下午好,

我用这个方法的一个版本映射了十几个盘符:

# Drive letter: M
# Shared drive path: \shared\folder
# Username: user123
# Password: password
import subprocess

# Disconnect anything on M
subprocess.call(r'net use * /del', shell=True)

# Connect to shared drive, use drive letter M
subprocess.call(r'net use m: \shared\folder /user:user123 password', shell=True)

只要我没有包含程序正在使用的文件的文件夹,上面的代码就可以很好地工作。

如果我 运行 在 cmd window 中使用相同的命令并且当我尝试断开驱动器时文件正在使用 returns 是你确定? Y/N.

如何通过 Py 脚本将这个问题传回给用户(或者如果没有别的,强制断开连接以便代码可以继续 运行?

要强制断开连接,请像这样用 /yes 试试

subprocess.call(r'net use * /del /yes', shell=True)  

为了 'redirect' 向用户提出问题,您有(至少)2 种可能的方法:

  • 读写子进程的标准输入/输出流
  • 使用退出代码并在必要时再次启动子流程

第一种方法非常脆弱,因为您必须阅读标准输出并解释它特定于您当前的语言环境,并稍后回答同样特定于您当前语言环境的问题(例如确认将完成英语 'Y' 但德语 'J' 等)

第二种方法更稳定,因为它或多或少依赖于静态 return 代码。我做了一个快速测试,如果取消问题,return 代码是 2;如果成功,当然只有 0。因此,使用以下代码,您应该能够处理问题并对用户输入采取行动:

import subprocess

exitcode = subprocess.call(r'net use * /del /no', shell=True)
if exitcode == 2:
    choice = input("Probably something bad happens ... still continue? (Y/N)")
    if choice == "Y":
        subprocess.call(r'net use * /del /yes', shell=True)
    else:
        print("Cancelled")
else:
    print("Worked on first try")