web-dev-qa-db-ja.com

あるPowerShellスクリプトから別のPowerShellスクリプトに引数または変数を渡すにはどうすればよいですか?

Cmdでは、実行するbatファイルが指定された後に引数をリストすることで、あるbatから別のbatに引数を渡すことができました。次に、実行するバットはそれらを%1、%2、%3などとして受け取りました。これはPowershellで実行できますか?

ユーザーに場所の入力を求めるps1スクリプトscript1が1つあります。そのスクリプトは処理されています。その場所は変数として保存されます。 $ loc。最初のスクリプトでは、ユーザーが、より多くのオプションを持つ別のps1スクリプトscript2を実行するオプションを選択できるという点があります。 script1からscript2に$ locを渡したい。

Script1で、私は次のことを試しました。

param ($loc)
start-process "\script2.ps1" -ArgumentList $loc
start-process "\script2.ps1" -$loc
start-process "\script2.ps1"

次にスクリプト2です

args[0]
$loc

私はおそらく、引数を渡すことを理解していないだけだと知っています。別のオプションがbatスクリプトを呼び出すということです。 -ArgumentList $ locを使用すると、問題なく渡されます。 「Setloc =%1」を使用して、batスクリプトでその引数を取得します。

6
user3377627

あるPowerShellスクリプトを別のPowerShellスクリプトから実行するのにStart-Processは必要ありません。必要なパラメータを使用して2番目のスクリプトを呼び出すだけです。

# script1.ps1

$loc = Read-Host 'Enter location'

C:\path\to\script2.ps1 $loc 'other parameter'

2番目のスクリプトでは、引数リストには、たとえば$args配列を介してアクセスできます。

# script2.ps1

Write-Host $args[0]
Write-Host $args[1]

次のように名前付きパラメーターを定義することもできます。

# script2.ps1

Param($Location, $Foo)

Write-Host $Location
Write-Host $Foo

または(より完全な)このように:

# script2.ps1

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$true)]
  [string]$Location,
  [Parameter(Mandatory=$false)]
  [string]$Foo
)

Write-Host $Location
Write-Host $Foo

名前付きパラメーターを定義すると、順序を気にすることなく引数を渡すことができます。

C:\path\to\script2.ps1 -Foo 'other parameter' -Location $loc

または、関数本体にチェックを実装することなく、パラメータを自動的に設定する 検証済み

# script2.ps1

Param(
  [ValidateSet('a', 'b', 'c')]
  [string]$Location,
  [ValidatePattern('^[a-z]+$')]
  [string]$Foo
)

Write-Host $Location
Write-Host $Foo

名前付きパラメーターが定義されたよりも多くの引数が渡された場合、それらの追加の引数は$args配列に格納されます。

PS C:\> 猫test.ps1[。 。\ test.ps1'foo''bar '
 foo 
 bar

詳細については、 Get-Help about_Functions_Advanced_Parameters を参照してください。

14
Ansgar Wiechers
_param ($loc)
_

スクリプトのパラメータを定義する_.ps1_スクリプトの先頭にあるので、次のように呼び出します。

 PathToMyScript\MyScript.ps1 -loc ValueOfLoc 

関数のparamステートメントで[CmdletBinding()]を使用することを含め、すべての 適用できる属性 はスクリプトでも機能します。

1
Richard