Задать вопрос
@atm87

Как занести диапазон ip адресов в таблицу базу данных Postgresql?

Всю голову уже сломал. При нажатии на кнопку "OK" в таблицу базу данных должен записаться диапазон ip адресов согласно данным из переменных $ipaddress1 = "10.62.39.50" и $ipaddress2 = "10.62.39.55"
То есть, должно быть вот так:
6569791ea6fa6189859310.jpeg
При запуске кода, данные в таблицу не заносятся. Появляется ошибка:
6569792c55706988747186.jpeg
function Connect-DB
{
    [CmdletBinding()]
    param
    (
        [string]$dbServer = 'localhost',
        [string]$dbName = 'postgres',
        [string]$dbUser = 'postgres',
        [string]$dbPass = 'postgres',
        [string]$port = '5432'
    )
    
    $szConnect = "Driver={PostgreSQL UNICODE(x64)};Server=$dbServer;Port=$port;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
    $cnDB = New-Object System.Data.Odbc.OdbcConnection($szConnect)
    $dsDB = New-Object System.Data.DataSet
    $cnDB.Open()
    $adDB = New-Object System.Data.Odbc.OdbcDataAdapter
    $adDB.SelectCommand = New-Object System.Data.Odbc.OdbcCommand($commandDB, $cnDB)
    $adDB.Fill($dsDB)
    $cnDB.Close()
}

$ipaddress1 = "10.62.39.50"
$ipaddress2 = "10.62.39.55"
if (-not [string]::IsNullOrEmpty($ipaddress1) -and -not [string]::IsNullOrEmpty($ipaddress2))
{
    Write-Host "Успех"
	# проверка на валидность IP адресов
	$ipObj = [System.Net.IPAddress]::None
	if ([System.Net.IPAddress]::TryParse($ipaddress1, [ref]$ipObj) -and [System.Net.IPAddress]::TryParse($ipaddress2, [ref]$ipObj))
	{
        Write-Host "Проверка на валидность пройдена"
		# если проверка на валидность пройдена, то дальше проверяем на совпадения 3-х октетов
		$ipaddress1 = [System.Net.IPAddress]($ipaddress1) # 10.62.39.50
        Write-Host $ipaddress1
		$ipaddress2 = [System.Net.IPAddress]($ipaddress2) # 10.62.39.55
        Write-Host $ipaddress2
		$octets1 = $ipaddress1 -split '\.' # 10 62 39 50
        Write-Host $octets1
		$octets2 = $ipaddress2 -split '\.' # 10 62 39 55
        Write-Host $octets2
		$first3Octets1 = ($octets1 | Select-Object -First 3) -join '.' # 10.62.39
        Write-Host $first3Octets1
		$first3Octets2 = ($octets2 | Select-Object -First 3) -join '.' # 10.62.39
        Write-Host $first3Octets2
		if ($first3Octets1 -eq $first3Octets2)
		{
			if ([int]$octets1[3] -lt [int]$octets2[3]) # 50 < 55
			{                          
                # получаем диапазон ip-адресов
				$ipadr1 = $ipaddress1.GetAddressBytes()
                
				[Array]::Reverse($ipadr1)
				$ipadr1 = ([System.Net.IPAddress]($ipadr1 -join '.')).Address
                Write-Host $ipadr1
				
				$ipadr2 = $ipaddress2.GetAddressBytes()
				[Array]::Reverse($ipadr2)
				$ipadr2 = ([System.Net.IPAddress]($ipadr2 -join '.')).Address
				Write-Host $ipadr2
				
                for ($x = $ipadr1; $x -le $ipadr2; $x++)
				{
					$ip = ([System.Net.IPAddress]$x).GetAddressBytes()
					[Array]::Reverse($ip)
					$ip = $ip -join '.'
					Write-Host $ip
                    $commandDB = "INSERT INTO public.ipaddress (ip) VALUES ('$ip'::inet) returning id;"
                    Connect-DB($commandDB)
				}
			}
		}
		else
		{
			$textboxError = "Первые три октета IP адресов не совпадают."
		}
	}
	else
	{
		$textboxError = "Неверно введены IP адреса. В поле 'От' введите начальное значение IP адреса. В поле 'До' введите конечное значение IP адреса."
	}
}


Думаю, что нужно править код в цикле, но не знаю как. Уже 2-ой день бьюсь
  • Вопрос задан
  • 172 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@MaxKozlov Куратор тега PowerShell
Ошибка вот тут
Connect-DB($commandDB)
Во-первых, уберите скобки, в PS они для параметров при вызове функций не нужны

и Где тут вообще место для команды ?

function Connect-DB
{
    [CmdletBinding()]
    param
    (
        [string]$dbServer = 'localhost',
        [string]$dbName = 'postgres',
        [string]$dbUser = 'postgres',
        [string]$dbPass = 'postgres',
        [string]$port = '5432'
    )

у вас там дальше по коду $commandDB используется, а в параметрах её нет
Поставьте первым параметром
function Connect-DB
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory)]
        [string]$CommandDB,
        [string]$dbServer = 'localhost',

и используйте как
Connect-DB $commandDB, а лучше Connect-DB -commandDB $commandDB

а вообще надо бы разделить connect-db на connect-db и invoke-db
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы