我有两个PowerShell脚本。 第一个脚本具有以下代码:
$var = "abc"
$DIR = "C:\"
$SCRIPT_NAME = "abc.ps1"
&"${DIR}\${SCRIPT_NAME}" #execute the second script
如果我想将变量$var
传递给第二个脚本,我该如何实现?我需要在第一个和第二个脚本中放入什么代码?
答案 0 :(得分:2)
参数(推荐):使用参数将值传递给第二个脚本。
Step2.ps1:
param ($myparameter)
write-host $myparameter
Step1.ps1:
$var = "abc"
$DIR = "C:\"
$SCRIPT_NAME = "step2.ps1"
&"${DIR}\${SCRIPT_NAME}" -myparameter $var
备用:您还可以使用参数$args
(未与参数链接的额外值)。您可以使用$args[0]
指定第一个参数。但是我总是建议参数,因为参数需要按照特定的顺序(如果传递多个参数)等等。
Step2.ps1:
write-host $args[0]
Step1.ps1:
$var = "abc"
$DIR = "C:\"
$SCRIPT_NAME = "step2.ps1"
&"${DIR}\${SCRIPT_NAME}" $var
答案 1 :(得分:1)
有几种方法可以做你想要的,其中两种方法已经由@FrodeF.建议。
将变量作为(命名)参数传递:
# script1.ps1
$var = 'foo'
$dir = 'C:\some\folder'
$scriptname = "script2.ps1"
& "${dir}\${scriptname}" -Foo $var
# script2.ps1
Param($foo)
Write-Output $foo
这是最干净的解决方案。您有一个定义明确的界面,并以明确的方式将变量从一个脚本传递到另一个脚本。
参数定义还允许您强制创建参数(以便脚本在要求参数被省略时要求用户提供输入),需要特定的数据类型,轻松合并validation routines或添加{ {3}}
# script2.ps1
<#
.SYNOPSIS
Short description of the script or function.
.DESCRIPTION
Longer description of what the script or function actually does.
.PARAMETER Foo
Description of the parameter Foo.
#>
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)]
[ValidateRange(2,42)]
[int]$foo
)
Write-Output $foo
有关详细信息,请参阅comment-based help。
将变量作为未命名的参数传递:
# script1.ps1
$var = 'foo'
$dir = 'C:\some\folder'
$scriptname = "script2.ps1"
& "${dir}\${scriptname}" $var
# script2.ps1
Write-Output $args[0]
这是第二种最佳方法,因为您仍然以明确的方式传递变量,但界面的定义不如以前那么好。
将变量定义为环境变量:
# script1.ps1
$env:var = 'foo'
$dir = 'C:\some\folder'
$scriptname = "script2.ps1"
& "${dir}\${scriptname}"
# script2.ps1
Write-Output $env:var
这是一种比基于参数的方法更不干净的方法,因为变量是使用“side-channel”(进程环境,由子进程继承)传递的。
只需在第一个脚本中定义变量,然后在第二个脚本中使用它:
# script1.ps1
$var = 'foo'
$dir = 'C:\some\folder'
$scriptname = "script2.ps1"
& "${dir}\${scriptname}"
# script2.ps1
Write-Output $var
这也可以,因为通过使用Get-Help about_Function_Advanced_Parameters
(&
),第二个脚本在与第一个脚本相同的上下文中运行,因此可以访问相同的变量。但是,如果有人在不同的上下文/范围中运行第二个脚本或者在不知道隐式依赖性的情况下修改它,那么“传递”这样的变量将很容易破坏。
如果你想走这条路线,通常最好只使用第一个脚本用于变量(和函数)定义,并在第二个脚本中使用call operator,以便将定义导入{{3第二个脚本:
# script1.ps1
$var = 'foo'
# script2.ps1
. 'C:\path\to\script1.ps1'
Write-Output $var
从技术上讲,通过文件传递值将是另一种选择。但是,我建议不要使用这种方法有几个原因:
$env:TEMP
文件夹中创建文件来缓解),