【问题标题】:Passing a filename into associated Powershell script将文件名传递给关联的 Powershell 脚本
【发布时间】:2015-11-18 20:24:21
【问题描述】:

我正在创建一个脚本,以在用户双击 Windows 资源管理器中的文件时提供要启动的程序选择。我将选定的文件扩展名与已包装到 .exe 中的脚本相关联。

但是在 Launcher 脚本中,我需要使用用户双击的文件名来创建命令行字符串来启动选定的程序。

如何在脚本中获取该文件名?例如“%1”

注意:Windows 快捷菜单不合适,因为我也会在网页中使用此脚本。

谢谢!

【问题讨论】:

  • 您好,您打算在网页中使用 PowerShell 或可执行文件吗?听起来很奇怪。
  • 这可能只是我不太了解,但这似乎不和谐:“我需要使用用户双击的文件名”然后“我还将在网页中使用此脚本”跨度>
  • 我正在创建一个启动器,允许用户在双击文件时选择操作。通常,双击文件名会提供由文件关联确定的单个操作。这将用于自定义仪表板,该仪表板还使用文件关联来确定单击文件名的超链接时的操作。

标签: powershell menu launch


【解决方案1】:

$args 变量保存传递给 PowerShell 脚本的参数。

如果你把,例如:

Write-Host $args[0]

在您的脚本中,您将看到脚本调用中传递的第一个参数。

PS > .\myscript.ps1 "test string"

会输出

test string

【讨论】:

  • 是的,但我没有使用命令行启动脚本。相反,由于文件关联,Windows 正在调用执行。我尝试在启动器中使用 $args[0],但它似乎是空的。
  • 我认为你可以修改那个调用,至少在注册表中,看到这个:msdn.microsoft.com/en-us/library/cc144158%28VS.85%29.aspx来自这个问题:stackoverflow.com/questions/1387769/…
  • @JohnM 我认为 sodawillow 提供的 MSDN 链接提供了您需要的线索。 “%1”是被点击文件的文件名。它必须是“命令”键(在注册表中)中脚本名称之后的第一个标记,因此缺少的部分是在脚本文件的开头添加类似 param( $fileNameSelected) 的语句。 $fileNameSelected 将是在脚本的命令行上指定为第一个参数的任何内容。
【解决方案2】:

答案是@sodawillow 和@user2460798 答案的组合。我很感激你们每个人都给了我你的意见。谢谢!

  1. 脚本必须定义一个参数以从双击接收路径和文件名(注意 Param 声明必须在任何其他代码之前)“Param([String]$FileNameSelected)”。
  2. 脚本在启动程序时必须使用参数 $FileNameSelected 作为参数。
  3. 将您的文件扩展名与您的脚本相关联(包装到 .exe - 我使用的是 PS2EXE)。

这是一个示例脚本:

Param([String]$FileNameSelected)

$title = "Launch Menu"
$message = "Do you want to launch program A, B, or C?"
$pA = New-Object System.Management.Automation.Host.ChoiceDescription "&Notepad", "Launches Notepad."
$pB = New-Object System.Management.Automation.Host.ChoiceDescription "&B", "Launches program B."
$pC = New-Object System.Management.Automation.Host.ChoiceDescription "&C", "Launches program C."
$options = [System.Management.Automation.Host.ChoiceDescription[]]($pA, $pB, $pC)
$result = $host.ui.PromptForChoice($title, $message, $options, 0)

switch ($result)
    {
        0 {
           $wshell = New-Object -ComObject Wscript.Shell
           $executable = 'notepad.exe'
           $argument = '"' + $FileNameSelected + '"'                                
           Start-Process $executable $argument -workingdirectory "c:\windows\system32"
          }
        1 {
           $wshell = New-Object -ComObject Wscript.Shell
           $executable = 'ProgramB.exe'
           $argument = '"' + $FileNameSelected + '"'                                
           Start-Process $executable $argument -workingdirectory "C:\Program Files (x86)\Test"
          }
        2 {
           $wshell = New-Object -ComObject Wscript.Shell
           $executable = 'ProgramC.exe'
           $argument = '"' + $FileNameSelected + '"'                                
           Start-Process $executable $argument -workingdirectory "C:\Program Files\Test"
          }
    }

【讨论】:

    猜你喜欢
    • 2023-01-23
    • 1970-01-01
    • 2019-10-22
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多