Как изменить Модуль PSini другим способом для чтения файла в PowerShell? - PullRequest
0 голосов
/ 31 марта 2019

Я читаю INI-файл с этим модулем PSIni.По какой-то причине я не хочу использовать этот модуль для чтения моего файла.Есть ли способ сделать это?

Этот код работает с модулем PSIni.

Function Write-File
{
    Param(
    [parameter(mandatory=$true)]$FilePath,
    [parameter(mandatory=$true)] $a,
    [parameter(mandatory=$true)] $b,
    [parameter(mandatory=$true)] $c
    )
    Import-Module PsIni
    $file1 = Get-IniContent $FilePath
    $file1["$a"]["$b"] = "$c"  
    $file1 | Out-IniFile -FilePath $FilePath -Force
}

Я пытаюсь этот код без этого модуля.Но это не работает.

Function Write-File
{
    Param(
    [parameter(mandatory=$true)]$FilePath,
    [parameter(mandatory=$true)] $a,
    [parameter(mandatory=$true)] $b,
    [parameter(mandatory=$true)] $c
    )

    $file1 = Get-Content $FilePath
    $file1["$a"]["$b"] = "$c"  
    $file1 | Out-File -FilePath $FilePath -Force
}

1 Ответ

2 голосов
/ 31 марта 2019

Есть способ использовать WindowsAPI.

$src = @"
[DllImport("KERNEL32.DLL")]
public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, System.Text.StringBuilder lpReturnedString, uint nSize, string lpFileName);
[DllImport("KERNEL32.DLL")]
public static extern uint WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);
"@

Add-Type -MemberDefinition $src -Namespace WinApi -Name IniFileIO -Language CSharp

Function Read-IniFile ($Path, $Section, $Key) {
    $sb = [Text.StringBuilder]::new(1024)
    [WinApi.IniFileIO]::GetPrivateProfileString($Section, $Key, $null, $sb, $sb.Capacity, (Convert-Path -LiteralPath $Path)) > $null
    $sb.ToString()
}

Function Write-IniFile ($Path, $Section, $Key, $Value) {
    [WinApi.IniFileIO]::WritePrivateProfileString($Section, $Key, $Value, (Convert-Path -LiteralPath $Path)) >$null
}

Использование выглядит следующим образом.

Read-IniFile -Path "C:\sample.ini" -Section "Section1" -Key "Key1"
Write-IniFile -Path "C:\sample.ini" -Section "Section2" -Key "Key2" -Value "Hello"

Это случайный код, поэтому лучше использовать код, написанный mklement0 для фактического использования. Это более надежно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...