@@ -19,11 +19,36 @@ public sealed class PSScriptRequires
19
19
#region Properties
20
20
21
21
/// <summary>
22
- /// The list of modules required by the script.
22
+ /// The modules this script requires, specified like: #requires -Module NetAdapter#requires -Module @{Name="NetAdapter"; Version="1.0.0.0"}
23
23
/// Hashtable keys: GUID, MaxVersion, ModuleName (Required), RequiredVersion, Version.
24
24
/// </summary>
25
25
public ModuleSpecification [ ] RequiredModules { get ; private set ; } = Array . Empty < ModuleSpecification > ( ) ;
26
26
27
+ /// <summary>
28
+ /// Specifies if this script requires elevated privileges, specified like: #requires -RunAsAdministrator
29
+ /// </summary>
30
+ public bool IsElevationRequired { get ; private set ; }
31
+
32
+ /// <summary>
33
+ /// The application id this script requires, specified like: #requires -Shellid Shell
34
+ /// </summary>
35
+ public string RequiredApplicationId { get ; private set ; }
36
+
37
+ /// <summary>
38
+ /// The assemblies this script requires, specified like: #requires -Assembly path\to\foo.dll#requires -Assembly "System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
39
+ /// </summary>
40
+ public string [ ] RequiredAssemblies { get ; private set ; } = Utils . EmptyStrArray ;
41
+
42
+ /// <summary>
43
+ /// The PowerShell Edition this script requires, specified like: #requires -PSEdition Desktop
44
+ /// </summary>
45
+ public string [ ] RequiredPSEditions { get ; private set ; } = Utils . EmptyStrArray ;
46
+
47
+ /// <summary>
48
+ /// The PowerShell version this script requires, specified like: #requires -Version 3
49
+ /// </summary>
50
+ public Version RequiredPSVersion { get ; private set ; }
51
+
27
52
#endregion
28
53
29
54
#region Constructor
@@ -72,15 +97,15 @@ internal bool ParseContentIntoObj(string[] commentLines, out ErrorRecord[] error
72
97
requiresComment ,
73
98
out Token [ ] tokens ,
74
99
out ParseError [ ] parserErrors ) ;
75
-
100
+
76
101
if ( parserErrors . Length > 0 )
77
102
{
78
103
foreach ( ParseError err in parserErrors )
79
104
{
80
105
errorsList . Add ( new ErrorRecord (
81
- new InvalidOperationException ( $ "Could not requires comments as valid PowerShell input due to { err . Message } .") ,
82
- err . ErrorId ,
83
- ErrorCategory . ParserError ,
106
+ new InvalidOperationException ( $ "Could not requires comments as valid PowerShell input due to { err . Message } .") ,
107
+ err . ErrorId ,
108
+ ErrorCategory . ParserError ,
84
109
null ) ) ;
85
110
}
86
111
@@ -92,20 +117,51 @@ internal bool ParseContentIntoObj(string[] commentLines, out ErrorRecord[] error
92
117
ScriptRequirements parsedScriptRequirements = ast . ScriptRequirements ;
93
118
ReadOnlyCollection < ModuleSpecification > parsedModules = new List < ModuleSpecification > ( ) . AsReadOnly ( ) ;
94
119
95
- if ( parsedScriptRequirements != null && parsedScriptRequirements . RequiredModules != null )
120
+ if ( parsedScriptRequirements != null )
96
121
{
97
- RequiredModules = parsedScriptRequirements . RequiredModules . ToArray ( ) ;
122
+ // System.Management.Automation.Language.ScriptRequirements properties are listed here:
123
+ // https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.language.scriptrequirements?view=powershellsdk-7.4.0
124
+
125
+ if ( parsedScriptRequirements . IsElevationRequired )
126
+ {
127
+ IsElevationRequired = true ;
128
+ }
129
+
130
+ if ( parsedScriptRequirements . RequiredApplicationId != null )
131
+ {
132
+ RequiredApplicationId = parsedScriptRequirements . RequiredApplicationId ;
133
+ }
134
+
135
+ if ( parsedScriptRequirements . RequiredAssemblies != null )
136
+ {
137
+ RequiredAssemblies = parsedScriptRequirements . RequiredAssemblies . ToArray ( ) ;
138
+ }
139
+
140
+ if ( parsedScriptRequirements . RequiredModules != null )
141
+ {
142
+ RequiredModules = parsedScriptRequirements . RequiredModules . ToArray ( ) ;
143
+ }
144
+
145
+ if ( parsedScriptRequirements . RequiredPSEditions != null )
146
+ {
147
+ RequiredPSEditions = parsedScriptRequirements . RequiredPSEditions . ToArray ( ) ;
148
+ }
149
+
150
+ if ( parsedScriptRequirements . RequiredPSVersion != null )
151
+ {
152
+ RequiredPSVersion = parsedScriptRequirements . RequiredPSVersion ;
153
+ }
98
154
}
99
155
}
100
156
catch ( Exception e )
101
157
{
102
158
errorsList . Add ( new ErrorRecord (
103
- new ArgumentException ( $ "Parsing RequiredModules failed due to { e . Message } ") ,
104
- "requiredModulesAstParseThrewError" ,
105
- ErrorCategory . ParserError ,
159
+ new ArgumentException ( $ "Parsing RequiredModules failed due to { e . Message } ") ,
160
+ "requiredModulesAstParseThrewError" ,
161
+ ErrorCategory . ParserError ,
106
162
null ) ) ;
107
163
errors = errorsList . ToArray ( ) ;
108
-
164
+
109
165
return false ;
110
166
}
111
167
@@ -118,14 +174,50 @@ internal bool ParseContentIntoObj(string[] commentLines, out ErrorRecord[] error
118
174
internal string [ ] EmitContent ( )
119
175
{
120
176
List < string > psRequiresLines = new List < string > ( ) ;
177
+ if ( IsElevationRequired )
178
+ {
179
+ psRequiresLines . Add ( String . Empty ) ;
180
+ psRequiresLines . Add ( "#Requires -RunAsAdministrator" ) ;
181
+ }
182
+
183
+ if ( ! String . IsNullOrEmpty ( RequiredApplicationId ) )
184
+ {
185
+ psRequiresLines . Add ( String . Empty ) ;
186
+ psRequiresLines . Add ( String . Format ( "#Requires -ShellId {0}" , RequiredApplicationId ) ) ;
187
+ }
188
+
189
+ if ( RequiredAssemblies . Length > 0 )
190
+ {
191
+ psRequiresLines . Add ( String . Empty ) ;
192
+ foreach ( string assembly in RequiredAssemblies )
193
+ {
194
+ psRequiresLines . Add ( String . Format ( "#Requires -Assembly {0}" , assembly ) ) ;
195
+ }
196
+ }
197
+
198
+ if ( RequiredPSEditions . Length > 0 )
199
+ {
200
+ psRequiresLines . Add ( String . Empty ) ;
201
+ foreach ( string psEdition in RequiredPSEditions )
202
+ {
203
+ psRequiresLines . Add ( String . Format ( "#Requires -PSEdition {0}" , psEdition ) ) ;
204
+ }
205
+ }
206
+
207
+ if ( RequiredPSVersion != null )
208
+ {
209
+ psRequiresLines . Add ( String . Empty ) ;
210
+ psRequiresLines . Add ( String . Format ( "#Requires -Version {0}" , RequiredPSVersion . ToString ( ) ) ) ;
211
+ }
212
+
121
213
if ( RequiredModules . Length > 0 )
122
214
{
123
215
psRequiresLines . Add ( String . Empty ) ;
124
216
foreach ( ModuleSpecification moduleSpec in RequiredModules )
125
217
{
126
218
psRequiresLines . Add ( String . Format ( "#Requires -Module {0}" , moduleSpec . ToString ( ) ) ) ;
127
219
}
128
-
220
+
129
221
psRequiresLines . Add ( String . Empty ) ;
130
222
}
131
223
0 commit comments