是否可以执行内存映射的 PowerShell 脚本文件?
Is it possible to execute a memory-mapped, PowerShell script file?
我有一个 Go 应用程序,它将 PowerShell 命令作为输入,创建一个新的 ps1 文件,将命令写入文件,然后执行脚本文件。
如果文件对用户不可见就好了。
如果有某种方法可以将脚本文件创建为内存映射文件,然后执行该内存映射文件,那将是一个很好的解决方案。
使用 CGo,我可以从 Go 应用程序调用 C 或 C++。由于 PowerShell 可以使用 C# 对象,我想也许我们可以以某种方式调用 C# 代码(来自 C/C++ 或 Go)并创建一个 C# 内存映射文件对象,PowerShell 然后可以使用它来执行作为脚本。
诚然,我对如何从非托管代码调用托管代码一无所知。
那么,有没有什么方法可以获取这个包含 PowerShell 命令的字符串并将其作为脚本执行,而无需创建磁盘文件?
要使 powershell.exe
读取脚本输入作为标准输入,请将 -
作为命令行参数传递:
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
"strings"
)
func main() {
cmd := exec.Command("powershell", "-")
cmd.Stdin = strings.NewReader("Write-Output 'Hello, World!'")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Printf("pwsh out: %q\n", out.String())
}
使用 Go 1.16 you can embed 构建时可执行文件中的脚本:
package main
import (
"bytes"
_ "embed"
"fmt"
"log"
"os/exec"
"strings"
)
//go:embed script.ps1
var scriptBytes []byte
func main() {
cmd := exec.Command("powershell", "-")
cmd.Stdin = strings.NewReader(string(scriptBytes))
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Printf("pwsh out: %q\n", out.String())
}
我有一个 Go 应用程序,它将 PowerShell 命令作为输入,创建一个新的 ps1 文件,将命令写入文件,然后执行脚本文件。
如果文件对用户不可见就好了。
如果有某种方法可以将脚本文件创建为内存映射文件,然后执行该内存映射文件,那将是一个很好的解决方案。
使用 CGo,我可以从 Go 应用程序调用 C 或 C++。由于 PowerShell 可以使用 C# 对象,我想也许我们可以以某种方式调用 C# 代码(来自 C/C++ 或 Go)并创建一个 C# 内存映射文件对象,PowerShell 然后可以使用它来执行作为脚本。
诚然,我对如何从非托管代码调用托管代码一无所知。
那么,有没有什么方法可以获取这个包含 PowerShell 命令的字符串并将其作为脚本执行,而无需创建磁盘文件?
要使 powershell.exe
读取脚本输入作为标准输入,请将 -
作为命令行参数传递:
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
"strings"
)
func main() {
cmd := exec.Command("powershell", "-")
cmd.Stdin = strings.NewReader("Write-Output 'Hello, World!'")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Printf("pwsh out: %q\n", out.String())
}
使用 Go 1.16 you can embed 构建时可执行文件中的脚本:
package main
import (
"bytes"
_ "embed"
"fmt"
"log"
"os/exec"
"strings"
)
//go:embed script.ps1
var scriptBytes []byte
func main() {
cmd := exec.Command("powershell", "-")
cmd.Stdin = strings.NewReader(string(scriptBytes))
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Printf("pwsh out: %q\n", out.String())
}