У меня есть пакетный скрипт, который вызывает Python, а затем запускает программу Python.

Вместо того, чтобы использовать пакетный скрипт, я бы хотел использовать PowerShell.

Я не программист и не сценарист, и я безуспешно гуглил и исследовал, как получить правильный синтаксис. При тестировании я использовал несколько команд: invoke-item, invoke-command, set- и get-variable и некоторые другие, которые я забыл, и т.д.

Может ли кто-нибудь предоставить мне правильный синтаксис PowerShell для вызова сначала, исполняемый файл Python, а затем сам скрипт Python?

Сокращенный пакетный скрипт встроен вместе со скриптом Python, который работает как надо.

Заранее спасибо.

echo off

set winpy=C:\Users\AIODUDE.AIODUDE-PC\Downloads\WPy-3710\python-3.7.1.amd64\

if EXIST %winpy% (
"%winpy%python.exe" "%~dp0HBSS_XML_Parser_Driver_Action.py" )

Вызывается сценарий Python

import HBSS_Classes, os, HIPS_8_FW_XML_Parser_Action

hbss_parser = HBSS_Classes.HBSSXMLParser()
xmlfiles = []
print('############################')
print('# UNDER ACTIVE DEVELOPMENT #')
print('############################\n')
print("HBSS XML PARSER - DEVELOPED BY WADE, TIMOTHY J.")
print("This CLI application will create human readable CSV spreadsheets 
from\n""XML files directly exported from the McAfee ePolicy Orchestrator.")
print("\nSupported products:\n")
for each_entry in hbss_parser.product_dict:
    print(" " + each_entry)
print(" HOSTIPS_8000_FW")
print("\nThe following files will be checked against supported "
  "XML file types:\n")
for each_file in os.listdir():
    if each_file.endswith('.xml'):
        xmlfiles.append(each_file)
        print(each_file)
date_check = input("\nFor HIPS 8 FW Policies only, would you also like to create an additional \n.CSV file containing only new rules created/modified since a given date? \n(For all other policies, enter N): Y/N ")
if (date_check.lower().startswith('y')):
    date_input = input("\nFile will only contain new rules created/modified since\n MM-DD-YYYY? (include hyphens when entering date value): ")
    sincedate = True
else:
    sincedate = False
begin_check = input("\nBegin parsing to CSV? Y/N ")
if (begin_check.lower().startswith('y')):
    hbss_parser.currentDirXMLListBLDR()
    hbss_parser.hbssObjectListBLDR()
    hbss_parser.hbssObjParseToCSV()
    dirfiles = os.listdir()
    for xmlfile in xmlfiles:
        if (xmlfile[:-4] + '_CSV.csv') in dirfiles:
            pass
        else:
            try:
                args = ['HIPS_8_FW_XML_Parser_Action.py', xmlfile]
                HIPS_8_FW_XML_Parser_Action.main(args, True)
                if sincedate:
                    args = ['HIPS_8_FW_XML_Parser_Action.py', xmlfile, date_input]
                    HIPS_8_FW_XML_Parser_Action.main(args, True)
            except:
                pass

else:
    pass

1 ответ1

0

Лучший способ найти правильный путь, который я могу придумать, - разбить работу командного файла на соответствующие компоненты. Это очень простой пакетный файл, который выполняет среду Python и говорит ему запустить определенный скрипт. Из рассмотрения сценария Python видно, что командный файл предназначен для запуска из папки, содержащей сценарий Python и один или несколько XML-файлов.

echo off

Отключение эха просто говорит Windows не выводить каждую команду в командном файле на экран. Это более чистый способ запуска пакетных файлов и присутствует практически во всех пакетных файлах. Это не обязательно с Powershell.

set winpy=C:\Users\AIODUDE.AIODUDE-PC\Downloads\WPy-3710\python-3.7.1.amd64\

Эта команда создает переменную с именем winpy которая равна пути, в котором находится исполняемый файл Python.

if EXIST %winpy% (

Это начало оператора IF, который сначала проверяет, существует ли путь, указанный вами для winpy . Если это так, то он запускает код между двумя круглыми скобками.

"%winpy%python.exe" "%~dp0HBSS_XML_Parser_Driver_Action.py" )

Это линия, которая делает реальную работу. Он запускает исполняемый файл python.exe с параметром командной строки вашего текущего пути и именем скрипта.

%~dp0 распространяется на диск и путь, по которому вы запустили пакетный файл.

Поэтому, если вы назовете этот файл mybatch.bat и поместите его в c:\test то это примеры команды, которую он выполняет:

Пример 1. Если у вас открыто окно командной строки и вы находитесь в папке c:\users\yourname\downloads и вы вводите c:\test\mybatch.bat чтобы выполнить этот пакетный файл, пакетный файл запустит следующая команда:

"C:\Users\AIODUDE.AIODUDE-PC\Downloads\WPy-3710\python-3.7.1.amd64\python.exe" "c:\users\yourname\downloads\HBSS_XML_Parser_Driver_Action.py"

Пример 2: Если у вас открыто окно командной строки, и вы находитесь в папке c:\test\ и вы вводите mybatch.bat чтобы выполнить этот пакетный файл, пакетный файл запустит следующую команду:

"C:\Users\AIODUDE.AIODUDE-PC\Downloads\WPy-3710\python-3.7.1.amd64\python.exe" "c:\test\HBSS_XML_Parser_Driver_Action.py"

Эквивалентный скрипт Powershell v3 или более новый будет выглядеть так:

#Create the $winpy variable with the path to python.exe
$winpy = "C:\Users\AIODUDE.AIODUDE-PC\Downloads\WPy-3710\python-3.7.1.amd64\"

#Test if the $winpy path exists
if (test-path $winpy) {
    #Execute python.exe and start the script named 'HBSS_XML_Parser_Driver_Action.py' located in the same directory the powershell script is run from
    & "$($winpy)python.exe" "$PSScriptRoot\HBSS_XML_Parser_Driver_Action.py"
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .