Powershell脚本在通过双击启动时不起作用

cyvaqqii  于 2023-05-22  发布在  Shell
关注(0)|答案(7)|浏览(352)

我在执行powershell脚本时遇到了一些奇怪的行为。

  • 当我使用伊势运行我的脚本时,它工作得很好。
  • 当我打开Powershell.exe并运行我的脚本时,它工作得很好。
  • 当我打开cmd并使用powershell.exe -noexit ./myscript.ps1启动脚本时,myscript工作正常。

但是当我双击myscript时,powershell打开了几毫秒,我看到它显示了一些错误(红色字体),powershell窗口关闭。我无法追踪导致这个问题的错误,因为powershell窗口关闭得太快了。我甚至在我的hole脚本周围尝试了一个大的try-catch块,捕获任何[Exception]并将其写入日志文件。但是:不生成日志文件(不调用catch)。
如何跟踪该问题?是什么引起了这个麻烦呢?请注意,我的执行策略设置为无限制。

sxpgvts3

sxpgvts31#

在尝试此建议之前,请调用以下命令以查看您的当前设置(如果您希望稍后恢复它们):

cmd /c FType Microsoft.PowerShellScript.1

然后调用这个(注意,你将改变你的脚本是如何调用“从资源管理器”由这个):

cmd /c @"
FType Microsoft.PowerShellScript.1=$PSHOME\powershell.exe -NoExit . "'%1'" %*
"@

然后双击脚本,它不应该退出,-NoExit就可以了。查看错误消息并解决问题。但是现在你所有的脚本调用“从资源管理器”保持他们的控制台打开。然后,您可以从上述命令中删除-NoExit并再次运行它或恢复原始设置。
在PSv 2中调用脚本的一个好方法是here。在PS v3 -submitted issue中被破解。

mcdcgff0

mcdcgff02#

默认情况下,出于安全原因,当您双击.ps1文件时,操作为:编辑文件,而不是运行文件。
执行脚本:右键单击它并选择使用powershell运行

2hh7jdfx

2hh7jdfx3#

我也无法通过双击运行脚本,尽管手动运行它没有问题。我发现问题出在路上。当我从包含空格的路径运行脚本时,例如:
C:\Users\john doe\Documents\Sample.ps1
脚本无法运行。将脚本移动到:
C:\Scripts\Sample.ps1
它没有空格,解决了这个问题。

eh57zj3b

eh57zj3b4#

这很可能是本地执行策略的问题。
默认情况下,PowerShell配置为不运行未签名的脚本(即使是本地脚本)。如果你没有签署你的脚本,那么在Windows中更改默认的双击“操作”将不会有任何效果- PowerShell将打开,读取执行策略,检查脚本的签名,如果没有发现,将中止并显示错误。
在PowerShell中:
Help about_execution_policies
提供了所有血淋淋的细节,以及允许未签名脚本运行的方法(在合理范围内-您可能不想运行远程脚本,只想运行您保存到系统中的脚本)。
编辑:我看到在你的问题的末尾,你已经设置了执行策略为“无限制”,这应该允许脚本运行。但是,这对于遇到执行策略问题的其他人来说可能是有用的信息。

mwg9r5ms

mwg9r5ms5#

如果您要捕获错误,您很可能会看到以下内容
无法加载文件。该文件未进行数字签名。该脚本将不会在系统上执行。有关详细信息,请参阅“获取有关_signing的帮助”。
因为你可以从你自己启动的shell运行它,而不是用鼠标右键点击“用PowerShell运行”,我敢打赌你有x64系统。手动启动配置了执行策略的一个PowerShell版本,而右键单击则启动了另一个PowerShell版本。
尝试启动x64和x86版本,并检查每个版本中的安全策略

Get-ExecutionPolicy
8xiog9wr

8xiog9wr6#

我的情况与问题中描述的完全相同:我的脚本在任何地方都可以工作,除了双击。* 当我双击一个powershell窗口会打开,但然后它会在一秒钟左右后关闭。我的执行策略也设置为不受限制。
我尝试了选择的关于FType Microsoft.PowerShellScript.1的答案,但它没有改变任何东西。
我找到的唯一解决方案是一个解决方案:创建一个启动powershell的bat文件。
1.创建一个文件,复制并修改路径:powershell.exe -File "C:\Users\user\script\myscript.ps1"
1.保存为.bat

  • 双击球棒
  • 我还用.ahk启动powershell,用快捷方式直接指向powershell时它不起作用。我不得不指向.bat
y0u0uwnf

y0u0uwnf7#

在Ronen的带领下,我写了一个快速的C#控制台应用程序来修复PowerShell中的错误,如果完整路径中的任何地方都有空格,则无法在Explorer中双击启动。使用下面的代码编译控制台应用程序后,将exe放在C:\ProgramFiles中的某个位置,然后右键单击资源管理器中的任何powershell脚本,选择打开方式,选择另一个应用程序,更多应用程序,滚动到底部,在此PC上查找另一个应用程序,然后找到刚刚创建的控制台应用程序exe。现在,任何时候双击带有此扩展名的脚本,它都应该工作。对每种要双击运行的powershell脚本扩展类型执行。下地狱吧微软

using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

namespace PowershellLauncher
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Directory.SetCurrentDirectory(Path.GetDirectoryName(args[0]));
            StringBuilder shortPath = new StringBuilder(255);
            GetShortPathName(args[0], shortPath, shortPath.Capacity);
            Process.Start($"C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe", shortPath.ToString());
        }

        // https://www.c-sharpcorner.com/article/convert-long-to-short-file-names-in-C-Sharp/
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern int GetShortPathName(
         [MarshalAs(UnmanagedType.LPTStr)]
             string path,
         [MarshalAs(UnmanagedType.LPTStr)]
             StringBuilder shortPath,
         int shortPathLength
         );
    }
}

相关问题