我需要在PowerShell中读取Python文件。我在这里无法使用Import-Csv
的问题,因为在每个部分之前都可以获得一些信息。
我需要阅读Machine_List
并获取列表中存在的计算机的IP地址。
#machine1 details sample
machine_1 = {
"ip" : "192.168.x.xxx",
"username" : "abc",
"password" : "xyz"
}
#machine_2 details sample
machine_2 = {
"ip" : "192.168.x.xxx",
"username" : "abc",
"password" : "xyz"
}
#machine_3 details sample
machine_3 = {
"ip" : "192.168.x.xxx",
"username" : "abc",
"password" : "xyz"
}
#machine_list details sample
MACHINE_LIST = [
machine_1,
machine_2
]
我能够读取整个文件,无法提取变量的值。
# Read machine and the associated IP address
# Turn off restricted mode (Pre-req for powershell execution)
Set-ExecutionPolicy RemoteSigned
$machine_list = Get-Content "C:\\machine_list.py"
Foreach-Object ($line in machine_list)
{
Write-Host $line
}
我也尝试了这个,但它无法正常工作
Get-Content "C:\\machine_list.py" | Foreach-Object {
$var = $_.Split('=')
New-Variable -Name $var[0] -Value $var[1]
}
任何人都可以指导我完成这项实施吗?
答案 0 :(得分:1)
您的输入文件包含跨越多行的Python语句,因此只需逐行读取文件并将其拆分为"$closeButton.addEventListener is not a function"
个字符将无效。一点点正则表达魔术应该做你想要的,但是:
=
正则表达式细分:
$txt = Get-Content 'C:\machine_list.py' -Raw
$re = '(?ms)(\w+)\s*=\s*\{\s*"ip"\s*:\s*"(\d+\.\d+\.\d+\.\d+)"'
$txt | Select-String -Pattern $re -AllMatches |
Select-Object -Expand Matches |
ForEach-Object {
$var = $_.Groups | Select-Object -Skip 1 -Expand Value
New-Variable -Name $var[0] -Value $var[1]
}
允许正则表达式覆盖多行。(?ms)
匹配一个或多个字符,数字或下划线的序列。括号对匹配进行分组,以便以后可以将其作为单独的实体引用。(\w+)
匹配IP地址。同样,匹配被分组,以便以后可以引用。(\d+\.\d+\.\d+\.\d+)
匹配零个或多个空白字符。\s*
匹配文字左大括号(需要转义,因为大括号是正则表达式中的特殊字符。请注意,在PowerShell v3之前,参数\{
不可用。在这种情况下,您需要将-Raw
替换为Get-Content 'C:\machine_list.py' -Raw
。
此外,在哈希表中收集地址而不是创建单个变量可能是个好主意。
Get-Content 'C:\machine_list.py' | Out-String
要提取变量$machineNames = @{}
$txt | ... |
ForEach-Object {
$var = $_.Groups | Select-Object -Skip 1 -Expand Value
$machineNames[$var[0]] = $var[1]
}
,您需要一个不同的表达式,因为这是一种不同类型的数据结构。
MACHINE_LIST
然后你可以从哈希表中获取这样的IP地址:
$re2 = '(?ms)machine_list\s*=\s*\[\s*(\w+(?:,\s*\w+)*)\s*\]'
$txt | Select-String -Pattern $re2 |
Select-Object -Expand Matches |
ForEach-Object {
$machineList = $_.Groups[1].Value -split ',\s*'
}