我想请教一下,powershell的脚本之间如何传递全局变量。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想请教一下,powershell的脚本之间如何传递全局变量。相关的知识,希望对你有一定的参考价值。

例如:在A脚本里定义一个全局变量,然后调用B脚本,在B脚本里对全局变量的值进行修改,最后在A脚本里判断全局变量的值。 
今天已经解决了,换了一种方法,没有用从子脚本向父脚本返回值。
谢谢了。
不过我查到了方法,分享一下:
在子脚本里赋值:set-variable -name 变量名 -value 值 -scope 1
就可以在父脚本里接收到更改后的变量值。

首先告诉你,没有直接的方法。
可以考虑间接的方法:
1.如果你的变量仅仅是一个string,可以通过脚本A保存在环境变量里面,然后在B中更改,通过A继续读取。
2.如果你的变量是一个复杂对象,可以在A中定义,$a, 然后以参数的形式传递给B,最后以返回值的形式传递给A。
形如: $a= .\test.ps1 -Name "mosser"
参考技术A 这是办不到的,shell脚本中子shell不可能改变父shell的值,即使用export环境变量也不行。
建议用函数实现。
参考技术B 在子脚本里赋值:set-variable -name 变量名 -value 值 -scope 1
作用域从1改成0,就可以了。
但是为什么可以,不知道。本回答被提问者和网友采纳

如何将多个字符串参数传递给 PowerShell 脚本?

【中文标题】如何将多个字符串参数传递给 PowerShell 脚本?【英文标题】:How do I pass multiple string parameters to a PowerShell script? 【发布时间】:2010-09-06 13:39:01 【问题描述】:

我正在尝试进行一些字符串连接/格式化,但它会将所有参数放入第一个占位符中。

代码

function CreateAppPoolScript([string]$AppPoolName, [string]$AppPoolUser, [string]$AppPoolPass)

    # Command to create an IIS application pool
    $AppPoolScript = "cscript adsutil.vbs CREATE ""w3svc/AppPools/$AppPoolName"" IIsApplicationPool`n"
    $AppPoolScript += "cscript adsutil.vbs SET ""w3svc/AppPools/$AppPoolName/WamUserName"" ""$AppPoolUser""`n"
    $AppPoolScript += "cscript adsutil.vbs SET ""w3svc/AppPools/$AppPoolName/WamUserPass"" ""$AppPoolPass""`n"
    $AppPoolScript += "cscript adsutil.vbs SET ""w3svc/AppPools/$AppPoolName/AppPoolIdentityType"" 3"

    return $AppPoolScript

$s = CreateAppPoolScript("name", "user", "pass")
write-host $s

输出

cscript adsutil.vbs CREATE "w3svc/AppPools/name user pass" IIsApplicationPool
cscript adsutil.vbs SET "w3svc/AppPools/name user pass/WamUserName" ""
cscript adsutil.vbs SET "w3svc/AppPools/name user pass/WamUserPass" ""
cscript adsutil.vbs SET "w3svc/AppPools/name user pass/AppPoolIdentityType" 3

【问题讨论】:

【参考方案1】:

去掉括号和逗号。

调用你的函数为:

$s = CreateAppPoolScript "name" "user" "pass"

给予:

cscript adsutil.vbs CREATE "w3svc/AppPools/name" IIsApplicationPool
cscript adsutil.vbs SET "w3svc/AppPools/name/WamUserName" "user"
cscript adsutil.vbs SET "w3svc/AppPools/name/WamUserPass" "pass"
cscript adsutil.vbs SET "w3svc/AppPools/name/AppPoolIdentityType" 3

【讨论】:

【参考方案2】:

顺便说一句,使用 PowerShell here-string 也可能使您的函数更易于阅读,因为您不需要将所有 " 标记加倍:

function CreateAppPoolScript([string]$AppPoolName, [string]$AppPoolUser, [string]$AppPoolPass)

  # Command to create an IIS application pool
  return @"
cscript adsutil.vbs CREATE "w3svc/AppPools/$AppPoolName" IIsApplicationPool
cscript adsutil.vbs SET "w3svc/AppPools/$AppPoolName/WamUserName" "$AppPoolUser"
cscript adsutil.vbs SET "w3svc/AppPools/$AppPoolName/WamUserPass" "$AppPoolPass"
cscript adsutil.vbs SET "w3svc/AppPools/$AppPoolName/AppPoolIdentityType" 3
"@

【讨论】:

【参考方案3】:

保罗是对的。 在 PowerShell 中,函数参数不包含在括号中。 (方法参数仍然是。) 您最初的调用只是将一个大数组传递给函数,而不是您想要的三个单独的参数。

【讨论】:

以上是关于我想请教一下,powershell的脚本之间如何传递全局变量。的主要内容,如果未能解决你的问题,请参考以下文章

如何将开关参数传递给另一个 PowerShell 脚本?

如何将多个字符串参数传递给 PowerShell 脚本?

如何使用 Terraform local-exec 将命名参数传递给 powershell 脚本?

如何将命令行参数传递给 PowerShell ps1 文件

如何使用c#winforms将参数传递到Powershell脚本?

将文件扩展名作为参数传递给powershell脚本