使用其他语言激活 Powershell 脚本

Posted

技术标签:

【中文标题】使用其他语言激活 Powershell 脚本【英文标题】:Powershell script activation using other languages 【发布时间】:2021-10-04 08:23:45 【问题描述】:

我有一个 PS 脚本,我需要在用户无需打开 powershell 的情况下运行它——我认为最简单的事情是编写一个应用程序或 .bat 文件来运行 PS 脚本。但是我无法让脚本使用任何其他语言运行。

我尝试过使用 java,但它不运行脚本,C# 或批处理命令也不运行。我会附上下面的批次,因为这似乎是更简单的方法,我只是不确定为什么它不起作用 - 没有错误消息它只是不起作用。

编辑** Powershell 脚本如下,可以运行。我需要一个运行脚本的第三方应用程序。

$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup("Select a Folder that you want to Analyze
Please be aware the larger the folder size the Longer it will take to Generate")
@echo off
 
powershell.exe -ExecutionPolicy Unrestricted -Command "'I:\TestScript\FolderInformation.ps1'"
 
TIMEOUT /T 10

我只需要能够通过为不知道使用 ISE 或任何其他 PS 应用程序的用户启动单个应用程序来运行脚本。

到目前为止,我使用的任何应用程序或脚本都不能正常工作,只能使用 ISE 来运行它。

*****Java 代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PowerShellJavaDemo 

    public static void main(String[] args) throws IOException 

        String line;

        String command = "powershell.exe & \"I:\\testingscript\"";

        Process powerShellProcess = Runtime.getRuntime().exec(command);

        powerShellProcess.getOutputStream().close();

        BufferedReader stdout = new BufferedReader(new InputStreamReader(powerShellProcess.getInputStream()));
        while ((line = stdout.readLine()) != null) 
            System.out.println("Output: " + line);

        

        stdout.close();

        BufferedReader stderr = new BufferedReader(new InputStreamReader(powerShellProcess.getErrorStream()));
        while ((line = stderr.readLine()) != null) 
            System.out.println("Output: " + line);
        
        stderr.close();

    


    

【问题讨论】:

而here列出的选项并不能解决问题? 我建议您阅读 -file-command 选项的作用。 不是我自己不能运行 PS 脚本。脚本从 ISE 运行 - 我需要能够通过不同的程序运行它 哦,所以你想写一个程序来启动这个PS1。明白了,你使用了什么 Java 代码?也许这对我们来说是一个起点 为什么要使用其他脚本解释器?这真的没有必要。可以创建属性 Target 包含 %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -NoLogo -file "I:\TestScript\FolderInformation.ps1" 的快捷方式文件(.lnk 文件)并自定义其他属性,例如 Start inComment(将鼠标指针悬停在快捷方式上时显示为工具提示)。然后发布快捷方式文件。 【参考方案1】:

如下所示的两件事可能会有所帮助。

    删除路径\文件前后的'。如果这没有帮助,那么: 尝试使用“绕过”而不是“无限制”

@echo off

powershell.exe -ExecutionPolicy Bypass -Command"I:\TestScript\FolderInformation.ps1"

TIMEOUT /T 10

我一直使用它来与我们的服务器通信并运行更新或其他重要信息。

注意:您的组策略可能会限制这一点。如果以上都不起作用。

我可能有一个解决方案,您可以使用 ISE。

start powershell_ise.exe "I:\TestScript\FolderInformation.ps1"

timeout /t 5

ECHO Set obkey = CreateObject("WScript.Shell") > temp.vbs

ECHO obkey.SendKeys "F5" >> temp.vbs

cscript temp.vbs

DEL temp.vbs

timeout /t 5

taskkill /im powershell_ise.exe

pause

【讨论】:

遗憾的是,这也不起作用 - 所以它似乎是一个组策略的事情。问题是我无权更改这些,所以我不确定下一步。无论使用何种语言,似乎都没有运行脚本。 @MichaelSchwarz 我明白了。如果您无法打开 Powershell.exe 而不是 Powershell_ISE.exe 并从那里运行脚本,则组策略正在阻止 Powershell 运行。 ISE 通常用于测试,并且通常不包含在组策略中,因此您可以使用它的原因(我认为它通常被忽略)。您需要获得对组策略的访问权限,或者要求允许它在您尝试通过管理员运行它的系统上运行。你能在本地打开 gpedit.exe 吗? 我的任务是编写一个程序,该程序基本上根据用户输入在驱动器中搜索特定文件,并且它需要可由其他用户运行。我每次都可以右键单击并使用 ISE 运行,但我希望让用户更轻松,并允许他们简单地运行 .bat 之类的东西并运行脚本。 看看我编辑了我的答案以包含一个可能的解决方案。试一试,让我知道。 这确实有效,尽管我必须删除 taskkill,因为它会导致它在打开后立即关闭。但这是一种可能的解决方案。

以上是关于使用其他语言激活 Powershell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Powershell/其他脚本设置 Bamboo 变量?

启动时使用 Powershell 脚本的参数

如何使用Argument将路径文件作为输入数据获取到PowerShell中的其他脚本?

Python语言的特点及自学建议

如何使用 Powershell 'invoke-expression' 以其他用户身份运行可执行文件

从 Powershell 调用的 DLL 使用相对于 Powershell 安装目录的路径。如何将其设置为其他内容?