Как в powershell записать диапазон ip-адресов в базу данных postgresql?
Есть файл SubnetForm.ps1 в котором следующий код:
$ipStart = "10.62.39.1"
$ipEnd = "10.62.39.3"
Connect-DB
for ($x = $ipStart; $x -le $ipEnd; $x++)
{
$ip = ([System.Net.IPAddress]$x).GetAddressBytes()
[Array]::Reverse($ip)
$ip = $ip -join '.'
$commandDB = "INSERT INTO public.ip_addresses (ip_range) VALUES ('$ip'::inet);"
Write-Host $commandDB
Insert-DB -commandDB $commandDB
}
Есть второй файл в котором имеется функция соединения с БД и записи в БД:
# функция соединения с БД
function Connect-DB
{
[CmdletBinding()]
param
(
[Parameter(Mandatory)]
[string]$dbServer = 'localhost',
[string]$dbName = 'postgres',
[string]$dbUser = 'postgres',
[string]$dbPass = 'postgres',
[string]$port = '5432'
)
$connect = "Driver={PostgreSQL UNICODE(x64)};Server=$dbServer;Port=$port;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
$cnDB = New-Object System.Data.Odbc.OdbcConnection($connect)
$dsDB = New-Object System.Data.DataSet
$cnDB.Open()
}
function Insert-DB
{
[CmdletBinding()]
param (
$commandDB
)
$adDB = New-Object System.Data.Odbc.OdbcDataAdapter
$adDB.SelectCommand = New-Object System.Data.Odbc.OdbcCommand($commandDB, $cnDB)
$adDB.Fill($dsDB) | out-null
}
При запуске кода появляются ошибки:
INSERT INTO public.ip_addresses (ip_range) VALUES ('10.62.39.1'::inet);
ERROR: Обнаружено несколько неоднозначных перегрузок для "Fill", число аргументов: "1".
ERROR: C:\Users\062User\Documents\SAPIEN\PowerShell Studio\Projects\SFR-Management\SFR-Management.Run.ps1:430 знак:3
ERROR: + $adDB.Fill($dsDB) | out-null
ERROR: + ____________________________
ERROR: + CategoryInfo : NotSpecified: (:) [], MethodException
ERROR: + FullyQualifiedErrorId : MethodCountCouldNotFindBest
ERROR:
INSERT INTO public.ip_addresses (ip_range) VALUES ('10.62.39.2'::inet);
ERROR: Обнаружено несколько неоднозначных перегрузок для "Fill", число аргументов: "1".
ERROR: C:\Users\062User\Documents\SAPIEN\PowerShell Studio\Projects\SFR-Management\SFR-Management.Run.ps1:430 знак:3
ERROR: + $adDB.Fill($dsDB) | out-null
ERROR: + ____________________________
ERROR: + CategoryInfo : NotSpecified: (:) [], MethodException
ERROR: + FullyQualifiedErrorId : MethodCountCouldNotFindBest
ERROR:
INSERT INTO public.ip_addresses (ip_range) VALUES ('10.62.39.3'::inet);
ERROR: Обнаружено несколько неоднозначных перегрузок для "Fill", число аргументов: "1".
ERROR: C:\Users\062User\Documents\SAPIEN\PowerShell Studio\Projects\SFR-Management\SFR-Management.Run.ps1:430 знак:3
ERROR: + $adDB.Fill($dsDB) | out-null
ERROR: + ____________________________
ERROR: + CategoryInfo : NotSpecified: (:) [], MethodException
ERROR: + FullyQualifiedErrorId : MethodCountCouldNotFindBest
Ответы (1 шт):
Автор решения: Dyakov Alexander
→ Ссылка
Честно говоря, не понимаю, как в данном случае должен работать $x++, так как оно работает только с числами, а $ipstart в данном случае строка
[System.Net.IPAddress]$ipStart = "10.62.39.1"
[System.Net.IPAddress]$ipEnd = "10.62.39.3"
for ($x = $ipStart.Address; $x -le $ipEnd.Address; $x = $x+(1 -shl 24)){
$ip = ([System.Net.IPAddress]$x).GetAddressBytes()
[Array]::Reverse($ip)
$ip = $ip -join '.'
#ну и далее, что там нужно сделать с этим ip
}
Ещё возможно переменную $dsDB стоит определять во второй функции, раз она там используется а в первой не используется, также не уверен, что $cnDB из первой функции будет доступна во второй подробнее можно почитать в документации microsoft об областях действия переменных