映射窗口驱动Python:如何处理Win cmd Line何时需要输入

时间:2016-07-25 15:04:06

标签: python subprocess net-use

下午好,

我使用此方法的一个版本来映射十几个驱动器号:

# 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窗口中运行相同的命令并且当我尝试断开驱动器时正在使用文件,则返回您确定吗? Y / N

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

1 个答案:

答案 0 :(得分:0)

要强行断开连接,请尝试/yes,如此

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

为了重定向'向用户提出的问题(至少)有两种可能的方法:

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

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

第二种方法更稳定,因为它依赖于或多或少的静态返回码。我做了一个快速测试,如果取消问题,返回代码为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")