2016-07-25 46 views
1

下午好,映射窗口驱动的Python:如何处理当赢CMD线需要输入

我用了一个版本的这种方法来映射十几驱动器号:

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

我怎样才能通过PY脚本通过这个问题丢回给用户(或者,如果不出意外,强制断开连接,这样的代码可以继续运行?

回答

0

要强制断开与/yes尝试像这样

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

为了 '重定向' 问题给用户你有(至少)2种可能的方法:

  • 读写子流程
  • 与退出代码工作的标准输入/输出流,并启动子进程第二次如果有必要

第一种方法是很脆弱的,你必须阅读标准输出并将其解释为特定于您当前的语言环境,并稍后回答也是特定于您当前语言环境的问题(例如,确认是用英语'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") 
+0

谢谢DAXaholic。有没有什么方法可以将问题传回给用户,还是强制断开连接的唯一方式?这可以在99%的时间内完成,但我预见有人会失去工作,他们会在断开连接之前忘记保存(但是再次,这些人即使在提问/警告时也可能会失去工作)。 –

+0

我更新了我的答案 - 希望它有帮助 – DAXaholic

+0

你已经超越了,再次感谢你! –