2番目のPowerShellスクリプトの関数に引数として渡したい名前と値のペアのセットを生成する構成ファイルを読み取るスクリプトがあります。
設計時にこの構成ファイルに配置されるパラメーターがわからないため、この2番目のPowerShellスクリプトを呼び出す必要がある時点で、基本的に、この2番目のスクリプトへのパスを持つ変数が1つと、2番目の変数があります。パス変数で識別されるスクリプトに渡す引数の配列である変数。
したがって、2番目のスクリプト($scriptPath
)へのパスを含む変数は、次のような値を持つ可能性があります。
"c:\the\path\to\the\second\script.ps1"
引数($argumentList
)を含む変数は次のようになります。
-ConfigFilename "doohickey.txt" -RootDirectory "c:\some\kind\of\path" -Max 11
この状況から、$ argumentsListのすべての引数を使用してscript.ps1を実行するにはどうすればよいですか?
この2番目のスクリプトからのwrite-hostコマンドは、この最初のスクリプトが呼び出されるコンソールに表示されるようにしたいと思います。
ドットソーシング、Invoke-Command、Invoke-Expression、およびStart-Jobを試しましたが、エラーが発生しないアプローチは見つかりませんでした。
たとえば、最初の最も簡単なルートは、次のように呼び出されるStart-Jobを試すことだと思いました。
Start-Job -FilePath $scriptPath -ArgumentList $argumentList
...しかし、これはこのエラーで失敗します:
System.Management.Automation.ValidationMetadataException:
Attribute cannot be added because it would cause the variable
ConfigFilename with value -ConfigFilename to become invalid.
...この場合、「ConfigFilename」は2番目のスクリプトで定義されたパラメーターリストの最初のパラメーターであり、私の呼び出しは明らかにその値を「-ConfigFilename」に設定しようとしています。これは明らかにパラメーターを名前で識別することを目的としています。 、その値を設定しません。
私は何が欠けていますか?
編集:
わかりました。これは、invoke.ps1という名前のファイルにある、呼び出されるスクリプトのモックアップです。
Param(
[parameter(Mandatory=$true)]
[alias("rc")]
[string]
[ValidateScript( {Test-Path $_ -PathType Leaf} )]
$ConfigurationFilename,
[alias("e")]
[switch]
$Evaluate,
[array]
[Parameter(ValueFromRemainingArguments=$true)]
$remaining)
function sayHelloWorld()
{
Write-Host "Hello, everybody, the config file is <$ConfigurationFilename>."
if ($ExitOnErrors)
{
Write-Host "I should mention that I was told to evaluate things."
}
Write-Host "I currently live here: $gScriptDirectory"
Write-Host "My remaining arguments are: $remaining"
Set-Content .\hello.world.txt "It worked"
}
$gScriptPath = $MyInvocation.MyCommand.Path
$gScriptDirectory = (Split-Path $gScriptPath -Parent)
sayHelloWorld
...これは、invoker.ps1という名前のファイルにある呼び出しスクリプトのモックアップです。
function pokeTheInvokee()
{
$scriptPath = (Join-Path -Path "." -ChildPath "invokee.ps1")
$scriptPath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($scriptPath)
$configPath = (Join-Path -Path "." -ChildPath "invoker.ps1")
$configPath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($configPath)
$argumentList = @()
$argumentList += ("-ConfigurationFilename", "`"$configPath`"")
$argumentList += , "-Evaluate"
Write-Host "Attempting to invoke-expression with: `"$scriptPath`" $argumentList"
Invoke-Expression "`"$scriptPath`" $argumentList"
Invoke-Expression ".\invokee.ps1 -ConfigurationFilename `".\invoker.ps1`" -Evaluate
Write-Host "Invokee invoked."
}
pokeTheInvokee
私がinvoker.ps1を実行すると、これはInvoke-Expressionの最初の呼び出しで現在発生しているエラーです。
Invoke-Expression : You must provide a value expression on
the right-hand side of the '-' operator.
2番目の呼び出しは問題なく機能しますが、1つの重要な違いは、最初のバージョンではパスにスペースが含まれる引数を使用し、2番目のバージョンでは使用しないことです。これらのパスのスペースの存在を誤って処理していますか?