我编写了一个powershell脚本,它是一个完整的函数接受参数(例如函数名称(参数){}),下面是调用该函数的参数。
我希望能够在其.ps1文件中调用此函数,并传入参数。如何通过.bat或.cmd文件打包到函数的调用?我正在使用Powershell v2.0。
答案 0 :(得分:11)
你应该使用所谓的“dot-sourcing”脚本和带有多个语句的命令:脚本的点源+带参数的函数调用。
测试脚本Test-Function.ps1:
function Test-Me($param1, $param2)
{
"1:$param1, 2:$param2"
}
调用.bat文件:
powershell ". .\Test-Function.ps1; Test-Me -Param1 'Hello world' -Param2 12345"
powershell ". .\Test-Function.ps1; Test-Me -Param1 \"Hello world\" -Param2 12345"
注意:这不是必需的,但我建议用双引号括起整个命令文本,如果需要,使用CMD转义规则转义内部引号。
答案 1 :(得分:1)
我相信您所要做的就是在调用脚本时命名参数,如下所示:
powershell.exe Path\ScripName -Param1 Value1 -Param2 Value2
Param1和Param2是函数签名中的实际参数名称。
享受!
答案 2 :(得分:0)
要使用参数从 cmd 或批处理调用 PowerShell 函数,您需要使用 -Commmand
参数或其别名 -C
。
例如,Romans 答案适用于 PowerShell 5.1,但不适用于 PowerShell 7.1。
引用我在 GitHub 上留下的关于为什么相同的命令不起作用的问题是:
<块引用>为了支持 Unix shebang 行,pwsh 的 CLI 现在默认为 -File 参数(只需要一个脚本文件路径),而 powershell.exe 默认为 -Command / -c。 要使您的命令与 pwsh 一起使用,您必须明确使用 -Command / -C。
因此,如果您有一个 PowerShell 文件 test.ps1
:
function Get-Test() {
[cmdletbinding()]
Param (
[Parameter(Mandatory = $true, HelpMessage = 'The test string.')]
[String]$stringTest
)
Write-Host $stringTest
return
}
然后批处理文件将是:
rem Both commands are now working in both v5.1 and v7.1.
rem v7.1
"...pathto\pwsh.exe" -NoExit -Command ". '"...pathto\test.ps1"'; Get-Test ""help me"""
rem v5.1
powershell.exe -NoExit -Command ". '"...pathto\test.ps1"'; Get-Test ""help me"""
如果您的 ...pathto\test.ps1
包含空格,则 .ps1
周围的引号是必须的。
同样适用于 ...pathto\pwsh.exe
这是我完整发布的 Github 问题: