Skip to content

PSScript resource #937

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open

PSScript resource #937

wants to merge 12 commits into from

Conversation

SteveL-MSFT
Copy link
Member

@SteveL-MSFT SteveL-MSFT commented Jul 2, 2025

PR Summary

New PS7 and WinPS5.1 script resources. Allow inline script execution for get, set, and test operations. export isn't supported due to how it works and is reserved for actual resources.

If an operation isn't implemented, it is ignored with an info level message written and empty JSON being returned. However, if test is not implemented, then it always returns that it is _inDesiredState = true.

I did it async to preserve order of traces that could come out of the script. Note that Write-Information is mapped to trace level while Write-Verbose is mapped to info to align with how they are defined in DSC.

Separate Microsoft.DSC.Transitional/PowerShellScript and Microsoft.DSC.Transitional/WindowsPowerShellScript resources (latter is only on Windows) but they use the same underlying script as the resource.

Output is expected to not already be JSON and will be converted automatically. $VerbosePreference is continue, $DebugPreference is continue, and $ErrorActionPreference is stop.

Input can be any valid JSON and is passed to the single parameter declared in the param block as PSCustomObject. If the script has a param and no input is provided, that's an error. If input is provided and the script doesn't have a param, that is also an error. If more than one param is declared, that is also an error.

Example config using it:

# Example configuration mixing native app resources with classic PS resources
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
parameters:
  myName:
    type: string
    defaultValue: Steve
  myObject:
    type: object
    defaultValue:
      color: green
      number: 10
resources:
- name: Use PS script
  type: Microsoft.DSC.Transitional/PowerShellScript
  properties:
    input:
      - name: "[parameters('myName')]"
      - object: "[parameters('myObject')]"
    getScript: |
      param($inputArray)

      Write-Warning "This is a warning message"
      # any output will be collected and returned
      "My name is " + $inputArray[0].name
      "My color is " + $inputArray[1].object.color

PR Context

Fix #885

Copy link
Collaborator

@theJasonHelmick theJasonHelmick left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@SteveL-MSFT SteveL-MSFT requested a review from Copilot July 8, 2025 15:40
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces inline PowerShell script resources for both PowerShell 7 (PowerShellScript) and Windows PowerShell 5.1 (WindowsPowerShellScript), with accompanying manifests, implementation, tests, example configs, and build updates.

  • Added two resource manifests and the core psscript.ps1 engine
  • Comprehensive Pester tests covering get/set/test operations and error handling
  • Updated build script and packaging to include new files and example configuration

Reviewed Changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
resources/PSScript/psscript.dsc.resource.json Manifest for PowerShell 7 inline script resource
resources/PSScript/winpsscript.dsc.resource.json Manifest for Windows PowerShell 5.1 inline script resource
resources/PSScript/psscript.ps1 Core executor logic handling get/set/test and trace output
resources/PSScript/psscript.tests.ps1 Pester tests for new inline script resource behaviors
resources/PSScript/copy_files.txt Declares files to bundle under the resource folder
build.ps1 Packaging updates to include/exclude new resource files
dsc/examples/psscript.dsc.yaml Example DSC configuration using the new inline script resource
Comments suppressed due to low confidence (2)

resources/PSScript/psscript.ps1:51

  • The JSON property is named _inDesiredState, but tests reference InDesiredState. Rename the field to InDesiredState (and update schema) for consistency.
        @{ _inDesiredState = $true } | ConvertTo-Json -Compress

resources/PSScript/psscript.ps1:159

  • Consistent with the above change, rename this property to InDesiredState so that the output matches test expectations.
        @{ _inDesiredState = $outputObjects[0] } | ConvertTo-Json -Compress

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Have a PSScript resource
3 participants