【问题标题】:PowerShell: Run script from shortcut using relative pathPowerShell:使用相对路径从快捷方式运行脚本
【发布时间】:2014-04-24 19:23:31
【问题描述】:

编辑:对于未来的读者,简而言之,PowerShell 脚本不打算以这种方式使用,这就是为什么没有优雅的解决方案。

我有以下行,它以管理员身份从快捷方式运行脚本:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -noexit Start-Process Powershell -verb RunAs -ArgumentList "C:\Documents\WindowsPowerShell\Scripts\test.ps1"

我想改变:

“C:\Documents\WindowsPowerShell\Scripts\test.ps1”

到一个相对路径,例如:

".\test.ps1"

但我还没有弄清楚如何做到这一点。如何相对于快捷方式的位置运行脚本? (快捷方式和脚本在同一个文件夹中)

【问题讨论】:

  • 这是一个实际的快捷方式,就像您通过右键单击拖动并选择在此处创建快捷方式获得的一样?或者这是一个启动 PowerShell 脚本的批处理文件?或者这是从计划任务启动的?或其他?请尽可能明确。
  • @Entbark:通过右键单击并选择在此处创建快捷方式创建的实际快捷方式。
  • OK,然后如果你进入快捷方式属性,进入快捷方式选项卡,并确保 Start In 中的值与脚本的位置相同。试试看。
  • @Entbark:感谢您的帮助。不幸的是,无论我尝试什么,我都无法按照你的解释让它工作。我什至完全复制了您评论中的内容,但仍然遇到同样的错误。以下 noam 的解决方案对我有用。

标签: powershell


【解决方案1】:

经过反复试验,我想出了一个解决方案:

使用这个(为您的 .ps1 编辑)创建一个快捷方式,让脚本相对于任何目录以管理员身份运行:

CMD /C PowerShell "SL -PSPath '%CD%'; $Path = (GL).Path; SL ~; Start PowerShell -Verb RunAs -Args \""SL -PSPath '"$Path"'; & '".\YourScriptHere.ps1"'"\""

您必须清空快捷方式的“开始于”字段才能将其相对路径设置为工作目录。

或者,这里有一个脚本,它将为目录中的每个 .ps1 生成这些快捷方式之一(“开始”已清除):

(GCI | Where-Object {$_.Extension -eq ".ps1"}).Name | ForEach-Object {
    $WshShell = New-Object -ComObject WScript.Shell
    $Shortcut = $WshShell.CreateShortcut((GL).Path+"\$_ Run.lnk")
    $Shortcut.TargetPath = 'CMD'
    $Shortcut.Arguments = "/C PowerShell `"SL -PSPath `'%CD%`'; `$Path = (GL).Path; SL ~; Start PowerShell -Verb RunAs -Args \`"`"SL -PSPath `'`"`$Path`"`'; & `'`".\$_`"`'`"\`"`""    
    $Shortcut.IconLocation = 'PowerShell.exe'
    $Shortcut.Save()
}

如果需要,在第一个 \" 之后添加-NoExit-ExecutionPolicy Unrestricted 等。

注意事项:

第二个 PowerShell 管理员实例从第一个启动的原因是直接以管理员身份启动(通过勾选快捷方式的“以管理员身份运行”框),some reason 忽略“开始”并始终启动System32.

CMD 用于启动第一个实例,因为 PowerShell 当前无法解析包含方括号的路径,将它们解释为正则表达式字符。这通常可以使用 LiteralPath 参数(又名 PSPath)来避免,但在这里,路径是在启动时在幕后传递的,由开发人员来修复(我刚刚提交了一个错误报告 here)。

【讨论】:

  • 如果我需要多个参数,它似乎不起作用。例如。 CMD /C PowerShell "SL -PSPath '%CD%'; $Path = (GL).Path; SL ~; 启动 PowerShell -Verb RunAs -Args \"-ExecutionPolicy ByPass -WindowStyle Hidden" SL -PSPath '"$Path" '; & '".\DisconnectOnIdle.ps1"'"\""
【解决方案2】:

这肯定比现在更难。

此问题更有可能在 Windows Server 上影响您。在常规 Windows 上,您可以运行Set-ExecutionPolicy unrestricted,它将在计算机上、Windows Server 上(至少在 AWS 上)保持有效,从 powershell 脚本设置执行策略仅持续脚本会话并立即关闭所以你看不到错误。

我刚刚成功修改了 AWS 实例 bypassing group policy 上的注册表,并且可以简单地从任何目录右键单击 powershell 脚本并将快捷方式发送到可运行的桌面。

【讨论】:

    【解决方案3】:

    对于您的脚本,将其设置为默认使用 Powershell 打开。为您的脚本创建一个快捷方式并通过右键单击快捷方式,选择属性,单击快捷方式选项卡为其分配一个热键。将光标移动到选择快捷键并定义一个快捷键。每次按下快捷键,您的脚本都会运行

    【讨论】:

      【解决方案4】:

      这是一个丑陋的解决方法。

      Shortcut.lnk 文件,目标:%COMSPEC% /C .\launcher.cmd (source) 和开始:%CD%(或 blank)。

      Launcher.cmd 包含内容的文件:

      Powershell -noprofile -noexit -File %CD%\PSlauncher.ps1
      

      PSlauncher.ps1 包含内容的文件:

      Start-Process Powershell -verb RunAs -ArgumentList ($pwd.path + "\test.ps1")
      

      当然有更好的解决方案。也许使用Start-Process-WorkingDirectory 参数?或 storing credentials 与 Convert*-SecureString cmdlet?算我好奇吧。

      Why你想要快捷方式吗?

      【讨论】:

      • 感谢此解决方案有效,但正如您所说,它很丑陋。基本上,我想要一种简单的方法将脚本分发给对 PowerShell 一无所知的人。环顾四周,似乎将脚本打包成 exe 或创建 gui 将是另一种解决方案。
      • 是的。 This 在演示中看起来不错,但我还没有尝试过。当然,它配有咖啡机和烤箱,您可能不需要......
      【解决方案5】:

      当我从快捷方式运行脚本时,它使用实际脚本的路径。您可以使用pwd(当前工作目录)检查当前目录。您可以使用split-path -parent $MyInvocation.MyCommand.Definition 检查(然后使用)脚本的路径,就像What's the best way to determine the location of the current PowerShell script? 中的答案一样。

      所以要回答您的问题,您应该已经能够使用相对路径。你试过了吗?如果有,您的经历是什么?

      【讨论】:

      • 你能举例说明我需要使用的语法吗?
      • 你能说得更具体点吗?您需要哪个部分的语法?如您的问题所示,您似乎已经知道如何使用相对路径。
      • "C:\Documents\WindowsPowerShell\Scripts\test.ps1" 更改为 ".\test.ps1" 并单击快捷方式会出现错误,它无法将 ".\test.ps1" 识别为 cmdlet、可执行文件等。
      • 这里是另一个例子C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -noexit -command "& Start-Process Powershell -verb RunAs .\test.ps1",当从.\test.ps1无法识别的快捷方式运行时会导致错误。
      • 你如何告诉脚本从哪里运行?您是否将目录 (cd) 更改为它?或者您是否指定从哪里运行?如果你不指定 run-from 位置,它就不会知道你想让它在那里运行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多