【问题标题】:How can I return multiple values from a powershell script to the batch file that is calling it?如何将多个值从 powershell 脚本返回到调用它的批处理文件?
【发布时间】:2019-06-14 08:26:47
【问题描述】:

如何将多个值从 powershell 脚本返回到调用它的批处理文件?

我有一个返回多个值的 powershell 脚本。我想从批处理文件中调用它,并将每个单独的值放入批处理文件中的单独变量中。

只能返回一个值

powershell 代码(pstest.ps1):

 $p1=11
 $p2=22
 $p3=33
 exit

批处理文件:

 powershell .\pstest.ps1
 :: now I'd like to get those 3 returned values 
 :: into 3 individual variables so that I can do something like this:
 @echo First is %p1%, Second is %p2%, Third is %p3%

所以,它应该显示这个:

 First is 11, Second is 22, Third is 33

【问题讨论】:

  • @Lee_Dailey:从cmd.exe 调用的PowerShell 脚本总是在子进程 中运行,因此它无法设置调用者将看到的环境变量。
  • 我可能有一个高级的时刻,但我没想到 Powershell 代码会输出任何东西。当然,您只是为变量设置值,在设置变量时通常不会在脚本语言中输出。
  • @Lee_Dailey:是的,您可以持久future cmd.exe 会话设置一个环境变量——但这不是当前的用例。
  • @mklement0 - 啊!我认为在父范围内创建了 EnvVar。感谢您的澄清。 [咧嘴]

标签: powershell batch-file


【解决方案1】:

以完全相同的方式从任何应用程序中获取多个值:每行一个...

@echo off
setlocal EnableDelayedExpansion

set "i=0"
for /F "delims=" %%a in ('powershell "$p1=11; $p2=22; $p3=33; $p1; $p2; $p3"') do (
   set /A i+=1
   set "p!i!=%%a"
)

echo First is %p1%, Second is %p2%, Third is %p3%

我建议你阅读this answer 关于数组...

【讨论】:

    【解决方案2】:

    有关使用延迟扩展的更灵活的解决方案,该解决方案不需要让 PowerShell 脚本在单行上输出所有值并使用可变数量的输出,请参阅Aacini's helpful answer


    假设值的数量是固定的并且事先已知:

    • 使 PowerShell 脚本输出一个单行,其中包含带有已知分隔符的所有值。

    • 在批处理文件中,使用for /f "delims=... tokens=..." 捕获离散循环变量中的值,您可以将其分配给常规变量。

    使用 PowerShell 命令生成单行输出的简化示例,其中包含由 | 分隔的 3 个值(要将其应用于您的场景,请在您的 *.ps1 文件中使用 -File 而不是 -c-Command) 带有命令字符串):

    @echo off
    
    for /f "delims=| tokens=1,2,3" %%a in ('powershell -c " '11|22|33' "') do set "p1=%%a" & set "p2=%%b" & set "p3=%%c"
    
    :: echo the values of the newly created variables
    echo p1: [%p1%]
    echo p2: [%p2%]
    echo p3: [%p3%]
    

    以上产出:

    p1: [11]
    p2: [22]
    p3: [33]
    

    【讨论】:

      【解决方案3】:

      除了使用环境变量之外,您还可以根据 SachaDee 的回答 here 尝试类似的方法:

      PS:

      function get-multiplereturnvalues {
        "11"
        "22"
        "33"
      }
      get-multiplereturnvalues
      

      批处理/CMD

      @echo First is %p1%, Second is %p2%, Third is %p3%
      for /f "delims=" %%a in ('powershell .\multi.ps1') do @echo "$Value=%%a"
      

      哪些输出:

      "$Value=11"
      "$Value=22"
      "$Value=33"
      

      【讨论】:

      • 请求是“并让每个单独的值进入批处理文件中的单独变量”,而不仅仅是显示值...
      【解决方案4】:

      在 PowerShell 脚本中,我将创建一个包含结果的临时文件。在批处理文件中,调用 PowerShell 脚本后,我会使用 FOR /F 解析该临时文件,以获得结果并根据需要设置环境变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-14
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多