programing

PowerShell을 읽는 방법.PSD1 파일 안전

lovejava 2023. 8. 27. 08:48

PowerShell을 읽는 방법.PSD1 파일 안전

PowerShell 모듈 매니페스트 파일 형식(.psd1)은 기본적으로 특정 키가 필요한 해시 테이블 리터럴입니다.PowerShell 스크립트의 구성 파일에 적합합니다.궁극적으로 제가 원하는 것은 스크립트 관련 키 집합이 포함된 .psd1 파일을 읽는 것입니다.

예를 들어 (MyScriptConfig.psd1):

@{
    FTPHost = "ftp.blah.com"
    FTPUserName = "blah"
    FTPPassword = "blah"
}

XML, INI, JSON 등의 정보를 사용할 수 없는 이유는 없지만 PowerShell의 모듈 매니페스트와 동일한 기본 데이터 형식을 사용하고 싶습니다.

분명히 가장 쉬운 것은 텍스트를 읽고 그것을 전달하는 것입니다.Invoke-Expression그러면 해시 테이블이 반환되지만 파일에 있는 오류 발생 가능성이 높고 잠재적으로 안전하지 않은 모든 파일이 호출됩니다.

PowerShell cmdlet의 "안전한" 서브셋을 사용하여 이 데이터를 읽기 위해 cmdlet을 호출했다고 생각했지만,ConvertFrom-StringData그리고.DATA해시 테이블 리터럴이 포함된 임의 파일을 읽을 수 있는 섹션은 없습니다.

PowerShell에 내장되어 있어 이 작업을 수행할 수 있습니까?기본 제공되는 기능이 없다면 JSON 또는 Key=Value를 사용하여ConvertFrom-StringData.

Powershell 버전 5에서는 PSD1 파일을 안전하게 구문 분석할 수 있도록 Cmdlet Import-PowershellDataFile을 추가했습니다.

버전 5 이전에는 적어도 세 가지 솔루션이 있었습니다.

  1. Cmdlet 가져오기-로컬라이즈된 데이터입니다.언어 파일을 처리하기 위한 것이지만 PSD1 형식의 파일을 읽을 수 있습니다.

    # Create a test PSD1 file
    @'
        @{
            a1 = 'a1'
            a2 = 2
            a3 = @{
              b1 = 'b1'
            }
        }
    '@ | Set-Content -Path .path\example.psd1
    
    # Read the file
    Import-LocalizedData -BaseDirectory .\path -FileName example.psd1 -BindingVariable Data
    
    # Use the data
    $Data.a1
    $Data.a3.b1
    
  2. 데이터 섹션을 사용하여 인라인 데이터를 처리할 수도 있습니다(인라인은 목적을 달성하지 못합니다).

    # Safely parse data
    $Data2 = DATA {
        @{
            a1 = 'a1'
            a2 = 2
            a3 = @{
              b1 = 'b1'
            }
        }
    }
    
    # Use the data
    $Data2.a1
    $Data2.a3.b1
    
  3. 세 번째는 @Jakub Berezanski가 언급한 PowerShell DSC 매개 변수 변환 특성입니다.

PowerShell DSC는 구성을 호출할 때 .psd1 파일에 대한 경로 전달을 지원하는 데 사용되는 매개 변수 변환 특성을 구성 데이터 매개 변수 값으로 정의합니다.이 속성은 공개적이며 다음과 같은 사용자 지정 기능에서 사용할 수 있습니다.

function Parse-Psd1
{
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $true)]
        [Microsoft.PowerShell.DesiredStateConfiguration.ArgumentToConfigurationDataTransformation()]
        [hashtable] $data
    )
    return $data
}
Parse-Psd1 C:\MyData.psd1

속성 구현은 다음 cmdlet만 허용되는 제한된 언어 컨텍스트에서 파일 내용을 평가하는 내부 도우미를 호출합니다.

Import-LocalizedData
ConvertFrom-StringData
Write-Host
Out-Host
Join-Path

모듈 매니페스트는 PSH의 제한된 하위 집합만 사용하도록 특별히 설계되었지만 해당 모드에서 콘텐츠를 처리하고 모든 데이터를 가져올 수 있는 직접적인 방법은 없습니다1.그러나 다음을 사용하여 매니페스트의 유효성을 확인할 수 있습니다.Test-ModuleManifest2 그런 다음 파일의 내용을 평가해야 합니다.


1 적어도 PowerShell In Action 2nd Ed가 다루는 한.

2 안타깝게도 책의 온라인 사본은 주석을 허용하기 위해 소스 코드에 이미지를 사용하므로 여기서 복사할 수 없습니다.

언급URL : https://stackoverflow.com/questions/25408815/how-to-read-powershell-psd1-files-safely