Термин «Select-String» не распознается - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь получить только PID, запустив этот скрипт Python.

Моя текущая ошибка:

  1. Выбранная строка не распознается как внутренняяили внешняя команда
  2. Чтобы справиться с этой ошибкой, я подумал, что мне нужно бежать |добавив ^ -> Но, видимо, это не сработает
  3. Я добавил в некоторых \ бежать ", надеюсь, это правильно?

    cmd = "netstat -ano | findstr " + str(o)
    print (cmd)
    cmd += " | Select-String \"TCP\s+(.+)\:(.+)\s+(.+)\:(\d+)\s+(\w+)\s+(\d+)\" | ForEach-Object { Write-Output $_.matches[0].Groups[6].value }"
    print (cmd)
    
    pid = run_command(cmd)
    

Метод run_command делает это:

def  run_command(cmd_array,os_name='posix'):
    p = subprocess.Popen(cmd_array,shell=True,cwd=os.getcwd())
    output,err = p.communicate()
    print('output=%s'%output)
    print('err=%s'%err)
return output

Ожидаемый результат

Когда я запускаю только команду в командной строке, он дает мне PID -> 7556в этом случае. Не слишком уверен, почему он не работает для сценария, но работает в командной строке сам по себе.

enter image description here

1 Ответ

0 голосов
/ 12 июня 2019

Этот вопрос относится к ОС Windows

Ответ на мой вопрос

  1. С помощью комментариев я не использовал свой метод run_command, так какон использовал shell = True.

shell = True относится к cmd.exe в Windows, а не powershell.Команды, которые я написал, являются командами powershell.

Непосредственно используйте subprocess.call для запуска команд powershell

Сценарии Python

cmd = "netstat -ano | findstr 8080"
cmd += " | Select-String \"TCP\s+(.+)\:(.+)\s+(.+)\:(\d+)\s+(\w+)\s+(\d+)\" | ForEach-Object { Write-Output $_.matches[0].Groups[6].value }"

subprocess.call(["powershell.exe", cmd])
#this does the job but the code will print extra zeros along with PID. It was not what i was looking for.

Результат:

6492 (печатает PID пос некоторыми дополнительными нулями)

Что сработало для меня - Для тех, кто пытается получить только PID и убить порт, используя PID в скрипте Python

cmd = "for /f \"tokens=5\" %a in ('netstat -aon ^| find \":8080"
cmd += "\" ^| find \"LISTENING\"\') do taskkill /f /pid %a"

#I added in some \ to escape the "

run_command(cmd)

Результат:

УСПЕХ: Процесс с PID 2072 был прерван

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...