我有一个调用 Python 然后运行 Python 程序的批处理脚本。
我不愿意使用批处理脚本来执行此操作,而是希望使用 PowerShell。
我既不是程序员也不是脚本编写者,我曾用 Google 搜索并研究过如何获得正确的语法,但都无功而返。在测试中,我使用了一些命令: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
我能想到的让你走上正轨的最佳方法是将批处理文件的操作分解为相关组件。这是一个非常直接的批处理文件,它执行 python 环境并告诉它运行特定脚本。从查看 python 脚本来看,批处理文件似乎应该从包含 python 脚本和一个或多个 .xml 文件的文件夹运行。
echo off
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"
}