如何在批处理文件中使用PowerShell函数返回作为变量

11dmarpk  于 2023-02-16  发布在  Shell
关注(0)|答案(2)|浏览(218)

我试图使用myPowershellScript.ps1的返回值作为批处理文件中的变量。
myPowershellScript.ps1

function GetLatestText
{
    return "Hello World"
}

我试着用For /F函数。可能有更好的方法。
myBatch.bat

for /f "delims=" %%a in (' powershell -command "\\Rossi2\Shared\myPowershellScript.ps1" ') do set "var=%%a"

echo %var%

所需的输出是在cmd窗口中输出“Hello World”。
我试着使用批处理文件,因为一些旧进程使用它们。对于较新的进程,我在PowerShell中做所有事情,它工作得很好。
当前输出为空白。

ckx4rj1h

ckx4rj1h1#

  • 您尝试从批处理文件捕获PowerShell脚本输出的语法是正确的(假设脚本输出为 * 单行 *),[1]除了使用powershell.exe(Windows PowerShell CLI)的-File参数比-Command参数更健壮。
  • 有关何时使用-File-Command的信息,请参见this answer
  • 您的问题与PowerShell脚本本身有关:
  • 您正在 * 定义 * 函数Get-LatestText,但没有 * 调用 * 它,因此脚本不会产生输出。
  • 有三种可能的解决方案:
  • 将对Get-LatestText的显式调用放在函数定义 * 之后 *;如果要传递脚本接收的任何参数,请使用Get-LatestText @args
  • 根本不要定义函数,并使函数体成为脚本体。
  • 如果您的脚本包含 * 多个 * 函数,并且您希望调用其中的 * 一个 *,请选择性地:在PowerShell CLI调用中,点源脚本文件(. <script>),然后调用函数(这 * 确实 * 需要-Command):
for /f "delims=" %%a in (' powershell -Command ". \"\\Rossi2\Shared\myPowershellScript.ps1\"; Get-LatestText" ') do set "var=%%a"

 echo %var%

[1]for /f * 逐行 * 循环命令输出(忽略空行),因此对于多行输出,只有 * 最后 * 行将存储在%var%中-需要更多的工作来处理多行输出。

lnlaulya

lnlaulya2#

您可以将批处理和powershell合并到一个文件中(保存为.bat):

<# : batch portion
@echo off & setlocal

    for /f "tokens=*" %%a in ('powershell -noprofile "iex (${%~f0} | out-string)"') do set "result=%%a"
    echo PS RESULT: %result%

endlocal
goto :EOF

: end batch / begin powershell #>

function GetLatestText
{
    return "Hello World"
}

write-host GetLatestText

相关问题