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

Merged
merged 15 commits into from
Jul 18, 2025
Merged

PSScript resource #937

merged 15 commits into from
Jul 18, 2025

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. Write-Host is mapped to an info message.

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

@SteveL-MSFT SteveL-MSFT force-pushed the psscript branch 2 times, most recently from 67c6810 to 5ef7bba Compare July 4, 2025 01:04
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
Contributor

@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

Copy link

@SeeminglyScience SeeminglyScience left a comment

Choose a reason for hiding this comment

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

Lookin' good, I do have a couple suggestions

@SteveL-MSFT SteveL-MSFT enabled auto-merge July 18, 2025 20:44
@SteveL-MSFT SteveL-MSFT disabled auto-merge July 18, 2025 20:44
@SteveL-MSFT SteveL-MSFT merged commit 90b4e2a into PowerShell:main Jul 18, 2025
6 of 7 checks passed
@SteveL-MSFT SteveL-MSFT deleted the psscript branch July 18, 2025 20:44
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
4 participants