如何将adb命令发送到2个或更多连接的设备?

时间:2019-04-04 14:15:12

标签: android python cmd

我想向连接的Android设备发送adb命令, 例如,我想重启所有连接的设备。

现在我正在使用批处理文件:

@echo off

for /f %%i in ('adb devices^|findstr /e "device"') do (
    if "%1" == "shell" (
        start cmd /k adb -s %%i %*
    ) else (
        adb -s %%i reboot
    )
)

,然后在Python GUI应用程序中。我称它为:

subprocess.call('adb_reboot.bat')

有什么方法可以用Python编写以避免调用bat文件吗?

我不想使用Google pyadb

1 个答案:

答案 0 :(得分:0)

import subprocess, sys
from subprocess import PIPE

# Get devices from adb.
proc = subprocess.Popen('adb devices | findstr /e "device"', shell=True, stdout=PIPE, universal_newlines=True)
stdout = proc.communicate()[0].strip()

# Get device ids without the word device and append to devices list.
devices = []

for line in stdout.splitlines():
    for item in line.split():
        if item != 'device':
            devices.append(item)

# Exit if no devices.
if not devices:
    exit('No devices found.')

# loop through each device in the devices list.
for device in devices:
    if len(sys.argv) > 1 and sys.argv[1] == 'shell':
        subprocess.Popen(['start', 'cmd', '/k', 'adb', '-s', device] + sys.argv[1:], shell=True)
    else:
        subprocess.Popen(['adb', '-s', device, 'reboot'])

尝试一下。我没有adb可以测试,尽管它可以正常工作。

如果adb stderr 而不是 stdout 上输出,则也许可以将stdout=PIPE更改为stderr=PIPE

查看replacing shell pipeline关于将一个命令传递给另一个命令。