-
Notifications
You must be signed in to change notification settings - Fork 1
/
PS in Batch.ps1
57 lines (47 loc) · 2.03 KB
/
PS in Batch.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
function ConvertTo-PSBatchScript {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[String]
$PSScriptContents,
[Parameter(Mandatory = $false)]
[String[]]
$Arguments = @(),
# Consider using delayed expansion on variables
# If you explicitly specify $env:TEMP and run this as another user, it will map to the wrong user's temp folder
[Parameter(Mandatory = $false)]
[String]
$CurrentWorkingDirectory = "%TEMP%"
)
try
{ [void]([ScriptBlock]::Create($PSScriptContents)) }
catch
{ Write-Warning -Message "There was a problem parsing 'PSScriptContents' as a PowerShell script."; Write-Error $_; return }
if ($Arguments.Count -gt 0) {
$ArgumentsAL = [System.Collections.ArrayList]::new()
$ArgumentsAL.AddRange($Arguments)
$cliXml = [System.Management.Automation.PSSerializer]::Serialize($ArgumentsAL)
$ArgsBase64 = "-EncodedArguments " + ([Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($cliXml)))
}
$BatchBase64 = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($PSScriptContents))
$InvokePSLine = "%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -EncodedCommand $BatchBase64 $ArgsBase64"
return @"
@echo off
REM Set current working directory to a temporary folder
cd $CurrentWorkingDirectory
REM Execute PowerShell script
$InvokePSLine
"@
}
####################
if ($MyInvocation.MyCommand.Path) {
$Script:ScriptCWD = (Get-Item -Path $MyInvocation.MyCommand.Path).Directory.FullName
}
elseif ($PSScriptRoot) {
$Script:ScriptCWD = $PSScriptRoot
}
else {
throw "Cannot determine script's working directory"
}
$PSScriptContents = Get-Content -Path "$Script:ScriptCWD\Sample PS Script.ps1" -Raw
ConvertTo-PSBatchScript -PSScriptContents $PSScriptContents -Arguments @("Hello world!") | Set-Content -LiteralPath "$Script:ScriptCWD\Sample PS Script.bat" -Force