更新声明: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 中运行时,它会执行foobar.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
因此,引起您描述的错误的原因既不是函数的定义(其脚本块在执行时进行评估),也不是别名的定义。
更可能的是,错误与执行脚本块时的引用、错误的括号或参数有关。