【问题标题】:How do I call a DOSkey Alias from Powershell?如何从 Powershell 调用 DOSkey 别名?
【发布时间】:2019-01-07 07:53:07
【问题描述】:

我有我设置的 DOSKey 别名 (Aliases in Windows command prompt) 从注册表调用它,我希望能够从 powershell 运行它;有没有办法做到这一点?它真正做的只是在 %PATH% 环境变量中添加一些东西。

【问题讨论】:

  • 为什么需要使用 DOSkey 别名来执行此操作?您可以直接从您的 PS 代码中执行此操作。
  • 同意 - doskey 别名在 PowerShell 中是多余的。只需在您的配置文件中创建一个 PowerShell 别名或函数。
  • 原因是因为我希望别名持久。但我想我可以只使用 Powershell 配置文件吧?
  • 是的,您可以使用 PowerShell 配置文件(有六个配置文件脚本可供选择)来保留别名。但是,如果使用 -NoProfile 运行命令,则不会创建别名。有人建议不要在脚本中使用别名。

标签: powershell cmd environment-variables registry doskey


【解决方案1】:

以下是将您的 DOSKEY 宏复制到 PowerShell 别名的代码。这对于某些已经具有 PowerShell 别名或在 PowerShell 中无法以相同方式工作的命令可能有意义,也可能没有意义。

请注意,您必须将命令输入到当前 shell。

PS C:\src\t> type .\Get-DoskeyMacros.ps1
& doskey /MACROS |
    ForEach-Object {
        if ($_ -match '(.*)=(.*)') {
            Set-Alias -Name $Matches[1] -Value $Matches[2]
        }
    }
PS C:\src\t> . .\Get-DoskeyMacros.ps1

注意事项: (ht mklement0)

此代码假定已定义 doskey 别名,这在正常的 PowerShell 会话中不太可能。但是,您可以从定义了它们的 cmd 会话启动 PowerShell 会话,或者从定义它们的 PowerShell 运行批处理文件。

一个潜在的别名转换问题是 doskey 宏支持参数(例如,$*),而 PowerShell 别名不支持。

【讨论】:

    【解决方案2】:

    如果您不必使用 DOSKey 并且只想为命令起别名,则可以使用内置的Set-Alias 命令,如下所示:

    Set-Alias -Name np -Value notepad++
    

    这将在当前的 powershell 窗口打开时,将 np 别名为 notepad++。这还允许您使用np temp.txt 打开文件。 如果您想坚持这一点,可以将其添加到您的个人资料中。你可以通过编辑你的Microsoft.PowerShell_profile.ps1来做到这一点,简写是:

    notepad $profile
    

    随意使用 notepad++ 或您的 PATH 中可能拥有的任何其他编辑器。您可以将Set-Alias 行添加到文件底部并保存并关闭它。 然后,当您打开另一个 powershell 实例时,它将具有示例 np 别名可用。

    【讨论】:

      【解决方案3】:

      @lit 的脚本对我不起作用。 下面是一个有效的脚本。它将生成的Set-Alias 命令复制到$profile 脚本。

      doskey /MACROS |
       ForEach-Object {
           if ($_ -match '(.*)=(.*)') {
               echo ('Set-Alias -Name '+$Matches[1]+' -Value '+$Matches[2])
           }
        } > $profile
      

      注意事项:

      • 与原始脚本一样,它必须在从 cmd 会话启动的 PowerShell 会话中执行。
      • $profile 文件对我来说不存在。我首先必须创建它以及包含的文件夹。

      【讨论】:

      • 这也不起作用(至少对我来说)。我有一堆adb ... 别名插入配置文件脚本OK,但Powershell 不喜欢将这些命令用作值参数......即使我事先插入pushd <path to adb.exe>叹息你会认为一个 20 多年的熟练开发人员不会发现脚本编写如此可怕!任何帮助将不胜感激。
      • @Kenny83 你能举一个命令的具体例子吗?当你说 Powershell 不喜欢它们时,它实际上做了什么?
      • 一个简单的例子:我定义了以下doskey别名:doskey phone=adb connect <local phone IP>:5555,您的脚本将其转换为Set-Alias -Name phone -Value adb connect <local phone IP>:5555。这在启动 PS 时给了我以下错误:Set-Alias : A positional parameter cannot be found that accepts argument 'connect'。感谢您的帮助:-)
      • 我尝试将.exe 添加到adb 部分,并确保Set-Alias 命令在正确的工作目录中运行,但无济于事:-( 还有什么我可以试试吗?
      • 有道理。您必须用引号将整个 adb 命令括起来:echo ('Set-Alias -Name '+$Matches[1]+' -Value "'+$Matches[2]+'"')(未经测试)否则,它将将该命令的附加参数视为 Set-Alias 的参数
      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      相关资源
      最近更新 更多