从文件中读取变量

时间:2015-08-20 18:26:13

标签: python file powershell

我需要在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]
}

任何人都可以指导我完成这项实施吗?

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*'
  }