使用.bat文件调用PowerShell函数

4
我希望了解如何使用 .Bat 文件调用 PowerShell 函数。
我有一个简单的函数:
(Script.ps1)
function testfunction
{
Write-Log "Calling from Bat file"
}

我想要在 .Bat 文件中调用 testfunction 函数。 powershell .\Script.ps1 ...

现在有了PowerShell,为什么还要使用.bat文件呢? - John Saunders
PowerShell文件包含一系列函数,位于共享文件夹中。每个服务器本地都有一个不同的批处理文件。根据每个服务器的需要,批处理文件需要执行不同的函数,因此.bat文件需要根据服务器环境调用不同的函数。我对PowerShell还很陌生,所以我认为这是每个服务器自我管理的最简单方法。 - user2472363
我的意思是,使用另一个PowerShell脚本代替古老的.bat文件。 - John Saunders
好主意。我该怎么做? - user2472363
3
步骤一:学习基本的PowerShell。 - John Saunders
当然,.bat文件已经过时了,但它们仍然存在。假设它们总是可以避免是不明智的。 - ash
5个回答

4
我注意到有一个开关-ExecutionPolicy ByPass,它允许批处理文件使用Powershell运行。这里的方法可以实现,取自vonPryz的答案。
@echo off
:: Create a test script file
echo function test { write-host "Called from %~f0" } > s.ps1
powershell -ExecutionPolicy ByPass -command ". "%cd%\s.ps1"; test;"
del s.ps1
pause

谢谢你的...%cd%...。我还不知道这个。 - anion

3
使用命令行参数 -command 启动 Powershell,将脚本包含在其中并调用函数。在调用函数之前,需要对该脚本进行点源引用。
:: Create a test script file
C:\temp>echo function test { write-host "Called from .bat" } > c:\temp\s.ps1
C:\temp>powershell -command ". c:\temp\s.ps1; test;"
:: Output
Called from .bat

此外,请查看一些示例

我猜这个问题可以解决,但在Windows 8中,默认情况下我会收到以下错误提示:---> . : 文件D:\abc\s.ps1无法加载,因为在此系统上禁用了运行脚本。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=135170中的about_Execution_Policies。 - foxidrive
@foxidrive 根据您所喜欢的文档设置执行策略? - vonPryz
问题在于你不能给任何人建议而不告诉他们必须更改执行策略。这对单个计算机非常好,但不适用于一般脚本编写建议。 - foxidrive
@foxidrive,我不太明白你的推理。可以承认,OP似乎缺乏基本的Powershell技能。因此,关于设置执行策略的额外提示可能会有所帮助。然而,错误消息非常清晰,并提供了很好的建议,如果需要更改策略。 - vonPryz
我的意思是,每个使用这种技术的解决方案都需要一个警告,即除非采取进一步的步骤,否则它将无法正常工作。此外,在企业环境中,人们可能无法禁用安全设置使其正常工作。这不是一个“开箱即用”的技术,它不能自己运行,这使得它对那些提出问题但没有技术知识的人不太有用。这样说清楚了吗? - foxidrive

1
我知道这很旧,但最近我也试图做同样的事情,花了很长时间才找出该怎么做。答案非常简单。
在 BatchFile(RunMe)中: powershell -command ". Script.ps1; Set-SomeFunction %1 %2 %3 %4 %5"
然后你可以像这样调用 batch:
RunMe -SomeParm val -SomeParm2 val -SomeSwitch -SomeBool $true 另外,要以管理员身份运行: powershell -command "Start-Process -verb runas powershell" "'-noexit -command ". Script.ps1; Set-SomeFunction %1 %2 %3 %4 %5 %6 %7 %8 %9'"

0

我通常这样做:

powershell {Set-ExecutionPolicy unrestricted}
powershell.exe -executionpolicy ByPass ./script/powerhsell-script.ps1 %par1% %par2%
powershell {Set-ExecutionPolicy Restricted}

希望这对你有帮助 :)


0

我已经使用它完成了

powershell.exe -ExecutionPolicy Bypass -file ".\Write_date.ps1"

看起来与其他人所写的类似,但我不确定vonPryz所说的需要在调用脚本之前使用点源脚本。上述方法适用于执行策略设置为受限制的Win7。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接