规格

规格
更新声明:20190815@000000@THU 致力于为当前用户创建一个 powershell 初始配置文件,无需以管理员身份运行,该配置文件被授权从 ps-profilefile 运行命令,例如非 cmlet 特定的自定义别名。
更新声明:20190825@112626@SUN 创建了有效的 powershell 初始配置文件,该文件仅适用于当前用户,并被授权通过将执行策略设置为“RemoteSigned”来运行脚本,但自定义别名不起作用。只有记事本的别名有效。
更新声明:20190901@171442@SUN 仍然无法运行带有 cmd 等参数的可执行文件而不会出现错误。
更新声明:20190809@171100@SUN 删除了“ForEach-Object”的“%”ps 别名,改为只使用一个参数,但 ps 无法识别参数。如何让 powershell 识别参数?
更新声明:20190915@105906@SUN 赏金计划目前尚未结束,但尚未找到解决方案。

规格

PS C:\Windows\System32\WindowsPowerShell\v1.0> $PSVersionTable.PSVersion

主要次要版本修订
----- ----- ----- --------
5 1 18362145

我希望能够使用 Powershell 而不是命令提示符。为了做到这一点,我需要设置别名不是 cmdlet 或者像 notepad.exe 这样的基本程序。我想要定义的别名来自可执行文件,我发现这些可执行文件的参数太多,无法输入重复任务。下面是我想实现的别名,但无法让它工作。此自定义别名在 PS 中作为会话添加,仅用于演示目的(一旦它起作用,我将把它添加到当前用户 ps-profile 文件中)所以,我的问题是:如何定义一个不是 cmdlet 而是至少具有一个或多个参数的可执行文件的别名?

PowerShell 中定义的别名是否是查询 Cmdlet 的更简便方法?因为这是我从遇到的所有文档中得到的最多信息。

通过定义函数运行别名

CODELINE1_set函数:

[OLD] PS C:\Windows\System32\WindowsPowerShell\v1.0> function FB {pathto/foobar.exe -parameter1 %%(option1)s.%%(option1a)s -parameter2 --option2}

PS C:\Windows\System32\WindowsPowerShell\v1.0> function FB {pathto/foobar.exe -parameter2 --option2}

CODELINE2_definealiasw函数:

PS C:\Windows\System32\WindowsPowerShell\v1.0> set-alias FOOBAR -value FB

CODELINE3_run别名:

PS C:\Windows\System32\WindowsPowerShell\v1.0> FOOBAR

[OLD] FOOBAR:术语“FOOBAR”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。第 1 行,字符:1 + FOOBAR + ~~~~~~~ + CategoryInfo:ObjectNotFound:(FOOBAR:String) [],CommandNotF oundException + FullyQualifiedErrorId:CommandNotFoundException

New-Item:找不到与参数名称 '' 匹配的参数。在 C:\Users\user\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:1 char:47 + new-item alias:aliastofoobar -value foobar.exe -parameter2 --option1 + ~~ + CategoryInfo:InvalidArgument:(:) [New-Item],ParameterBindingException + FullyQualifiedErrorId:NamedParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand

为简单起见,使用记事本通过脚本运行别名

  • 您有一个可以运行命令的脚本吗?
    • 是的,请查看下面的脚本以了解内容以及 ps 启动时的错误
PS C:\Users\用户> $PROFILE
C:\Users\用户\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PS C:\Users\user> 测试路径 $PROFILE
真的
PS C:\Users\用户> 获取执行策略
远程签名
新项目别名:npa -value notepad.exe /A new_ansifile.txt
New-Item:找不到接受参数‘/A’的位置参数。
在 C:\Users\user\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:2 char:1
+ 新项目别名:np -value notepad.exe /A new
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo:InvalidArgument:(:)[新项目],ParameterBindingException
    + 完全合格错误标识:PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand

解决方案

  • 至今无

答案1

如果我理解你想做什么,那么是的,完全可行。

将 foobar.exe 调用括在引号中,使其成为单个字符串。

"foobar.exe -param1 -param2"

在您的函数中,放在cmd /c字符串前面。https://stackoverflow.com/questions/515309/what-does-cmd-c-mean

然后,使用作为函数名称Set-Alias,按照您喜欢的方式进行设置。-Value

全部一起...

function doSomething() {
    cmd /c "foobar.exe -param1 -param2"
}

Set-Alias -Name FOOBAR -Value doSomething

现在,当 FOOBAR 在 PS 中运行时,它会执行foob​​ar.exe-参数1-参数2就像您手动输入一样。

如果我误解了这个问题,请告诉我。希望这能有所帮助。

答案2

使用完全相同的 PSVersion 我得到了不同的结果:

PoSh> function FB {pathto/foobar.exe -parameter1 %%(option1)s.%%(option1a)s -parameter2 --option2}
PoSh> (Get-Command FB).Definition
pathto/foobar.exe -parameter1 %%(option1)s.%%(option1a)s -parameter2 --option2
PoSh> Set-Alias FOOBAR -Value FB
PoSh> Get-Alias FOOBAR

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           FOOBAR -> FB

因此,引起您描述的错误的原因既不是函数的定义(其脚本块在执行时进行评估),也不是别名的定义。

更可能的是,错误与执行脚本块时的引用、错误的括号或参数有关。

相关内容