gpt4 book ai didi

java - 从Java运行PowerShell文件说该文件没有 '.ps1'扩展名

转载 作者:行者123 更新时间:2023-12-02 23:40:25 24 4
gpt4 key购买 nike

我试图弄清楚如何从Java内部运行PowerShell脚本。请记住,我是Java的新手,所以可能会有更好的方法。

目前,我在安装PowerShell的Fedora 25工作站上。

here所述,首先安装Fedora .NET Core软件包:

sudo dnf config-manager --add-repo https://copr.fedorainfracloud.org/coprs/nmilosev/dotnet-sig/repo/fedora-25/nmilosev-dotnet-sig-fedora-25.repo
sudo dnf update
sudo dnf install dotnetcore

然后下载 RPM for CentOS 7并安装它。
sudo dnf install Downloads/powershell-6.0.0_beta.1-1.el7.centos.x86_64.rpm
powershell

然后,我使用了这个 post中的代码来运行“Hello world” ps1文件:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PowerShellCommand {
public static void main(String[] args) throws IOException {
String command = "powershell $PSVersionTable.PSVersion";
command = "powershell -ExecutionPolicy RemoteSigned -NoProfile -NonInteractive -File \"/home/b/Downloads/MyScript.ps1\"";

Process powerShellProcess = Runtime.getRuntime().exec(command);
powerShellProcess.getOutputStream().close();
String line;
System.out.println("Standard Output:");
BufferedReader stdout = new BufferedReader(new InputStreamReader(
powerShellProcess.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
System.out.println("Standard Error:");
BufferedReader stderr = new BufferedReader(new InputStreamReader(
powerShellProcess.getErrorStream()));
while ((line = stderr.readLine()) != null) {
System.out.println(line);
}
stderr.close();
System.out.println("Done");
}
}

尝试运行.ps1文件时遇到的错误是:

Processing -File '"/home/b/Downloads/MyScript.ps1"' failed because the file does not have a '.ps1' extension. Specify a valid Windows PowerShell script file name, and then try again.



当尝试从Java代码中运行此代码时,我确实获得了该变量的正确输出:
String command = "powershell $PSVersionTable.PSVersion";

当从bash shell运行以下命令时,在Gnome终端中也可以正常工作,并且通过说“Hello world”可以正确执行脚本:
powershell -ExecutionPolicy RemoteSigned -NoProfile -NonInteractive -File "/home/b/Downloads/MyScript.ps1"

谢谢您的帮助。

最佳答案

注意:

  • 自发布问题以来,PowerShell Core可执行文件的名称已从powershell更改为 pwsh ,这在下面的解决方案中得到了体现。
  • 问题中的特定脚本文件路径/home/b/Downloads/MyScript.ps1严格不要求使用引号(被包含在"..."中),但是通常可靠的解决方案应使用引号-这将在下面演示。


  • 通过将命令构造为单个字符串,嵌入式"实例保留为文字,这是错误消息所反射(reflect)的内容:

    Processing -File '"/home/b/Downloads/MyScript.ps1"' ...



    请注意'...'中的加引号的值如何包括"..."在内-字面意义上包含"字符的路径显然不存在,并且-由于结尾为"-没有.ps1扩展名。
    single-command-string form of Runtime.exec() 的作用是通过 StringTokenizer 对字符串进行仅按空格标记。因此,结果数组将保留嵌入的引号,也不会将带有嵌入的空格的引号标记识别为单个标记。

    您可以使用两种选择来解决此问题:
  • (a)使用-Command& 而不是-File来调用脚本,在这种情况下,PowerShell采用另一轮解析,因此嵌入式"实例被认为具有语法功能。
    String command = "pwsh -NoProfile -Command & \"/home/b/Downloads/MyScript.ps1\"";
  • (b)优选地,将命令行的 token 作为字符串数组传递:
    String[] command = new String[] { "pwsh", "-NoProfile", "-File", "/home/b/Downloads/MyScript.ps1" };

  • 请注意,对于(a),如果您在命令字符串中包含要传递给脚本的参数,那么PowerShell也将解析这些参数,这意味着您可能也需要对其使用嵌入式引号。

    请注意,对于(b)而言,如果指定脚本脚本路径参数为其自身的数组元素,则无需为该脚本路径参数使用嵌入式引号。通过使用PowerShell的-File参数,传递的所有参数都被视为文字。

    关于java - 从Java运行PowerShell文件说该文件没有 '.ps1'扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44087451/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com