Câu hỏi Cách đọc tệp PowerShell .PSD1 an toàn


Định dạng tệp kê khai mô-đun PowerShell (.psd1) về cơ bản là một chữ cái Hashtable với các khóa nhất định được mong đợi. Điều này lý tưởng cho tệp cấu hình cho tập lệnh PowerShell. Những gì tôi cuối cùng muốn làm là đọc một tập tin .psd1 có chứa một tập hợp các phím cụ thể cho kịch bản.

Ví dụ (MyScriptConfig.psd1):

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

Không có lý do gì tôi không thể sử dụng XML, INI, JSON hoặc bất kỳ thông tin nào, nhưng tôi muốn nó sử dụng cùng một định dạng dữ liệu cơ bản như mô-đun của PowerShell.

Rõ ràng điều dễ nhất là đọc văn bản và chuyển nó đến Invoke-Expression mà sẽ trả về một Hashtable, nhưng sau đó nó sẽ gọi bất cứ điều gì đó là trong tập tin, đó là lỗi dễ bị và có khả năng không an toàn.

Tôi nghĩ rằng tôi nhớ lại một lệnh ghép ngắn để đọc dữ liệu này bằng cách sử dụng một tập hợp con "an toàn" của các lệnh ghép ngắn PowerShell, nhưng tôi đã nghĩ đến ConvertFrom-StringData và DATA các phần, không cho phép tôi đọc một tệp tùy ý có chứa một chữ cái Hashtable.

Có cái gì đó được xây dựng trong PowerShell cho phép tôi làm điều này? Nếu không có gì được tích hợp, thì tôi có thể đi theo con đường của JSON hoặc Key = Value với ConvertFrom-StringData.


13
2017-08-20 15:32


gốc




Các câu trả lời:


Powershell phiên bản 5 đã thêm Cmdlet Import-PowershellDataFile để phân tích cú pháp các tệp PSD1 một cách an toàn.

Trước phiên bản 5, có ít nhất ba giải pháp:

  1. Cmdlet Nhập-LocalizedData. Mà, mặc dù dự định hoặc xử lý các tập tin ngôn ngữ, sẽ đọc bất kỳ tập tin định dạng 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. Cũng có thể xử lý dữ liệu trực tuyến bằng Phần dữ liệu (loại trực tuyến đánh bại mục đích).

    # Safely parse data
    $Data2 = DATA {
        @{
            a1 = 'a1'
            a2 = 2
            a3 = @{
              b1 = 'b1'
            }
        }
    }
    
    # Use the data
    $Data2.a1
    $Data2.a3.b1
    
  3. Thứ ba là thuộc tính chuyển đổi tham số PowerShell DSC được đề cập bởi @Jakub Berezanski.


19
2017-12-07 23:02





PowerShell DSC định nghĩa một thuộc tính chuyển đổi tham số, được sử dụng để hỗ trợ truyền một đường dẫn đến tệp .psd1 làm giá trị của tham số ConfigurationData khi gọi một Cấu hình. Thuộc tính này là công khai và có thể được sử dụng trong một hàm tùy chỉnh, chẳng hạn như:

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

Việc thực hiện thuộc tính gọi một trình trợ giúp nội bộ đánh giá nội dung của tệp trong ngữ cảnh ngôn ngữ bị hạn chế, chỉ cho phép các lệnh ghép ngắn sau:

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

11
2018-04-02 22:02





Các tệp kê khai mô-đun được thiết kế đặc biệt để chỉ sử dụng một tập con PSH bị hạn chế, tuy nhiên không có1 một cách trực tiếp để xử lý nội dung (và nhận tất cả dữ liệu) ở chế độ đó. Tuy nhiên, bạn có thể xác thực tệp kê khai bằng Test-ModuleManifest2 và chỉ sau đó đánh giá nội dung của tệp.


1 Ít nhất là xa như PowerShell đang hoạt động Ed thứ 2 bao gồm nó.

2 Rất tiếc, bản sao trực tuyến của sách sử dụng hình ảnh cho mã nguồn (để cho phép chú thích), vì vậy không thể sao chép tại đây.


2
2017-08-20 15:46