将变量传递给另一个脚本

时间:2016-03-15 22:46:51

标签: powershell

我有两个PowerShell脚本。 第一个脚本具有以下代码:

$var = "abc"    
$DIR = "C:\"
$SCRIPT_NAME = "abc.ps1"
&"${DIR}\${SCRIPT_NAME}" #execute the second script

如果我想将变量$var传递给第二个脚本,我该如何实现?我需要在第一个和第二个脚本中放入什么代码?

2 个答案:

答案 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文件夹中创建文件来缓解),
    • 如果之后没有清理文件,它很容易乱丢文件系统,
    • 当语言提供的简单内存操作就足够时,它会不必要地生成磁盘I / O.