-
-
Notifications
You must be signed in to change notification settings - Fork 59
/
Invoke-TaskFromVSCode.ps1
76 lines (61 loc) · 1.88 KB
/
Invoke-TaskFromVSCode.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<#PSScriptInfo
.VERSION 1.0.8
.AUTHOR Roman Kuzmin
.COPYRIGHT (c) Roman Kuzmin
.TAGS Invoke-Build, Task, VSCode
.GUID 1dcf7c94-b68d-4fb7-9e2b-886889b6c42e
.LICENSEURI http://www.apache.org/licenses/LICENSE-2.0
.PROJECTURI https://github.com/nightroman/Invoke-Build
#>
<#
.Synopsis
Invokes the current Invoke-Build task from VSCode
.Description
This script invokes the current task from the build script in VSCode.
Requires:
- Invoke-Build
- VSCode PowerShell
How to use:
https://github.com/nightroman/Invoke-Build/wiki/Invoke-Task-from-VSCode
.Parameter Console
Tells to invoke the task in an external console.
.Link
https://github.com/nightroman/Invoke-Build/wiki/Invoke-Task-from-VSCode
#>
param(
[Parameter()]
[switch]$Console
)
$ErrorActionPreference = 1
try {
$private:file = $null
try {
$private:context = $psEditor.GetEditorContext()
$file = $context.CurrentFile
}
catch {}
if (!$file) {throw 'Cannot get the current file.'}
# save if modified, #118
if ($psEditor.EditorServicesVersion -ge [version]'1.6') {
$file.Save()
}
$private:_Console = $Console
Remove-Variable Console
$private:path = $file.Path
if ($path -notlike '*.ps1') {throw "The current file must be '*.ps1'."}
$private:task = '.'
$private:line = $context.CursorPosition.Line
foreach($private:t in (Invoke-Build ?? $path).get_Values()) {
if ($t.InvocationInfo.ScriptName -ne $path) {continue}
if ($t.InvocationInfo.ScriptLineNumber -gt $line) {break}
$task = $t.Name
}
if ($_Console) {
$command = "Invoke-Build '$($task.Replace("'", "''"))' '$($path.Replace("'", "''"))'"
$encoded = [Convert]::ToBase64String(([System.Text.Encoding]::Unicode.GetBytes($command)))
Start-Process powershell.exe "-NoExit -NoProfile -ExecutionPolicy Bypass -EncodedCommand $encoded"
}
else {
Invoke-Build $task $path
}
} catch {if ($_.InvocationInfo.ScriptName -like '*Invoke-TaskFromVSCode.ps1') {$PSCmdlet.ThrowTerminatingError($_)} throw}