我想请教一下,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的脚本之间如何传递全局变量。的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Terraform local-exec 将命名参数传递给 powershell 脚本?