Skip to content

Commit e92d7b1

Browse files
author
James Brundage
committed
Adding New-PipeScript (source) (#94)
1 parent 2633715 commit e92d7b1

File tree

1 file changed

+200
-0
lines changed

1 file changed

+200
-0
lines changed

New-PipeScript.ps1.ps1

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
function New-PipeScript
2+
{
3+
<#
4+
.Synopsis
5+
Creates new PipeScript.
6+
.Description
7+
Creates new PipeScript and PowerShell ScriptBlocks.
8+
.EXAMPLE
9+
New-PipeScript -Parameter @{a='b'}
10+
#>
11+
[Alias('New-ScriptBlock')]
12+
param(
13+
# Defines one or more parameters for a ScriptBlock.
14+
# Parameters can be defined in a few ways:
15+
# * As a ```[Collections.Dictionary]``` of Parameters
16+
# * As the ```[string]``` name of an untyped parameter.
17+
# * As an ```[Object[]]```.
18+
# * As a ```[ScriptBlock]```
19+
[Parameter(ValueFromPipelineByPropertyName)]
20+
[ValidateTypes(TypeName={[Collections.IDictionary], [string],[Object[]], [Scriptblock]})]
21+
$Parameter,
22+
23+
# The dynamic parameter block.
24+
[Parameter(ValueFromPipelineByPropertyName)]
25+
[ValidateScriptBlock(NoBlocks, NoParameters)]
26+
[Alias('DynamicParameterBlock')]
27+
[ScriptBlock]
28+
$DynamicParameter,
29+
30+
# The begin block.
31+
[Parameter(ValueFromPipelineByPropertyName)]
32+
[ValidateScriptBlock(NoBlocks, NoParameters)]
33+
[Alias('BeginBlock')]
34+
[ScriptBlock]
35+
$Begin,
36+
37+
# The process block.
38+
[Parameter(ValueFromPipelineByPropertyName)]
39+
[ValidateScriptBlock(NoBlocks, NoParameters)]
40+
[Alias('ProcessBlock')]
41+
[ScriptBlock]
42+
$Process,
43+
44+
# The end block.
45+
[Parameter(ValueFromPipelineByPropertyName)]
46+
[ValidateScriptBlock(NoBlocks, NoParameters)]
47+
[Alias('EndBlock')]
48+
[ScriptBlock]
49+
$End,
50+
51+
# The script header.
52+
[Parameter(ValueFromPipelineByPropertyName)]
53+
[string]
54+
$Header
55+
)
56+
57+
begin {
58+
$ParametersToCreate = [Ordered]@{}
59+
$allDynamicParameters = @()
60+
$allBeginBlocks = @()
61+
$allEndBlocks = @()
62+
$allProcessBlocks = @()
63+
$allHeaders = @()
64+
}
65+
66+
process {
67+
if ($parameter) {
68+
# The -Parameter can be a dictionary of parameters.
69+
if ($Parameter -is [Collections.IDictionary]) {
70+
$parameterType = ''
71+
# If it is, walk thur each parameter in the dictionary
72+
foreach ($EachParameter in $Parameter.GetEnumerator()) {
73+
# Continue past any parameters we already have
74+
if ($ParametersToCreate.Contains($EachParameter.Key)) {
75+
continue
76+
}
77+
# If the parameter is a string and the value is not a variable
78+
if ($EachParameter.Value -is [string] -and $EachParameter.Value -notlike '*$*') {
79+
$parameterName = $EachParameter.Key
80+
$ParametersToCreate[$EachParameter.Key] =
81+
@(
82+
$parameterAttribute = "[Parameter(ValueFromPipelineByPropertyName)]"
83+
$parameterType
84+
'$' + $parameterName
85+
) -ne ''
86+
}
87+
# If the value is a string and the value contains variables
88+
elseif ($EachParameter.Value -is [string]) {
89+
# embed it directly.
90+
$ParametersToCreate[$EachParameter.Key] = $EachParameter.Value
91+
}
92+
# If the value is a ScriptBlock
93+
elseif ($EachParameter.Value -is [ScriptBlock]) {
94+
# Embed it
95+
$ParametersToCreate[$EachParameter.Key] =
96+
# If there was a param block on the script block
97+
if ($EachParameter.Value.Ast.ParamBlock) {
98+
# embed the parameter block (except for the param keyword)
99+
$EachParameter.Value.Ast.ParamBlock.Extent.ToString() -replace
100+
'^[\s\r\n]param(' -replace ')[\s\r\n]$'
101+
} else {
102+
# Otherwise
103+
$EachParameter.Value.ToString() -replace
104+
"\`$$($eachParameter.Key)[\s\r\n]$" -replace # Replace any trailing variables
105+
'param()[\s\r\n]{0,}$' # then replace any empty param blocks.
106+
}
107+
}
108+
elseif ($EachParameter.Value -is [Object[]]) {
109+
$ParametersToCreate[$EachParameter.Key] =
110+
$EachParameter.Value -join [Environment]::Newline
111+
}
112+
}
113+
} elseif ($Parameter -is [string]) {
114+
$ParametersToCreate[$Parameter] = @(
115+
"[Parameter(ValueFromPipelineByPropertyName)]"
116+
"`$$Parameter"
117+
)
118+
} elseif ($Parameter -is [Object[]]) {
119+
$currentParam = @()
120+
$currentParamName = ''
121+
foreach ($EachParameter in $Parameter) {
122+
if ($EachParameter -is [string] -and -not $EachParameter.Contains(' ')) {
123+
if ($currentParam) {
124+
$ParametersToCreate[$currentParamName] = $currentParam
125+
$currentParam = @()
126+
$currentParamName = ''
127+
}
128+
$currentParam += "`$$EachParameter"
129+
$currentParamName = $EachParameter
130+
} elseif ($EachParameter -is [string] -and $EachParameter.Contains(' ')) {
131+
$currentParam = @(
132+
if ($EachParameter.Contains("`n")) {
133+
"<#" + [Environment]::newLine + $EachParameter + [Environment]::newLine + '#>'
134+
} else {
135+
"# $EachParameter"
136+
}
137+
) + $currentParam
138+
} elseif ($EachParameter -is [type]) {
139+
$currentParam += "[$($EachParameter.Fullname)]"
140+
}
141+
}
142+
if ($currentParamName) {
143+
$ParametersToCreate[$currentParamName] = $currentParam
144+
}
145+
}
146+
}
147+
148+
if ($header) {
149+
$allHeaders += $Header
150+
}
151+
152+
if ($DynamicParameter) {
153+
$allDynamicParameters += $DynamicParameter
154+
}
155+
156+
if ($Begin) {
157+
$allBeginBlocks += $begin
158+
}
159+
160+
if ($process) {
161+
$allProcessBlocks += $process
162+
}
163+
164+
if ($end) {
165+
$allEndBlocks += $end
166+
}
167+
168+
}
169+
170+
end {
171+
$newParamBlock =
172+
"param(" + [Environment]::newLine +
173+
$(@(foreach ($toCreate in $ParametersToCreate.GetEnumerator()) {
174+
$toCreate.Value -join [Environment]::NewLine
175+
}) -join (',' + [Environment]::NewLine)) +
176+
[Environment]::NewLine +
177+
')'
178+
179+
180+
$createdScriptBlock = [scriptblock]::Create("
181+
$($allHeaders -join [Environment]::Newline)
182+
$newParamBlock
183+
$(if ($allDynamicParameters) {
184+
@(@("dynamicParam {") + $allDynamicParameters + '}') -join [Environment]::Newline
185+
})
186+
$(if ($allBeginBlocks) {
187+
@(@("begin {") + $allBeginBlocks + '}') -join [Environment]::Newline
188+
})
189+
$(if ($allProcessBlocks) {
190+
@(@("process {") + $allProcessBlocks + '}') -join [Environment]::Newline
191+
})
192+
$(if ($allEndBlocks -and -not $allBeginBlocks -and -not $allProcessBlocks) {
193+
$allEndBlocks -join [Environment]::Newline
194+
} elseif ($allEndBlocks) {
195+
@(@("end {") + $allEndBlocks + '}') -join [Environment]::Newline
196+
})
197+
")
198+
$createdScriptBlock
199+
}
200+
}

0 commit comments

Comments
 (0)