あるスクリプトからの引数で別のスクリプトを呼び出す
質問
設定ファイルを読み込むスクリプトがあり、その結果、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
この状態から、$argumentListからすべての引数を指定してscript.ps1を実行するにはどうしたらよいでしょうか。
この2番目のスクリプトからの書き込みホストコマンドが、この最初のスクリプトが起動されたコンソールに見えるようにしたいのですが。
ドットソース、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" に設定しようとしています。
私は何を見逃しているのでしょうか?
EDITです。
OK、これはいわゆるスクリプトのモックアップで、invokee.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回目ではそうなっていないことです。 これらのパスにスペースがあることを誤って処理したのでしょうか?
どのように解決するのですか?
あはは。 これは、スクリプトへのパスにスペースがあるという単純な問題であることが判明しました。
Invoke-Expression の行を変更する。
Invoke-Expression "& `"$scriptPath`" $argumentList"
...で十分でしたので、キックオフしました。 ネオリスクさん、ご協力ありがとうございました。
関連
-
[解決済み] PowerShellでファイルをダウンロードする
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] bashシェルスクリプトの全引数を伝搬させる
-
[解決済み] コマンドライン引数の読み方・処理方法は?
-
[解決済み] オプションの入力引数を取るbashスクリプトを書くには?
-
[解決済み] PowerShellでコマンドライン引数を処理する方法
-
[解決済み] Bashスクリプト内でGDBを使用してコマンドライン引数を持つプログラムを実行するにはどうすればよいですか?
-
[解決済み】rakeタスクにコマンドライン引数を渡す方法
-
[解決済み】Bashスクリプトに渡された引数の数を確認する
-
[解決済み] PowerShellから変数に格納されたコマンドを実行する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】powershellで再利用するために資格情報を保存すると、ConvertTo-SecureString : Key not valid for use in specified stateというエラーが発生する。
-
[解決済み] OutVariableを使用してArrayListを作成する
-
[解決済み] ヌル値の式でメソッドを呼び出すことはできない
-
[解決済み] cmdletbinding()】とは何ですか、どのように機能するのですか?
-
[解決済み] Powershell ISE 内の別の PS1 スクリプトから PowerShell スクリプト PS1 を呼び出す
-
[解決済み] PowerShell 'Or' ステートメント
-
[解決済み] PowerShellで改行するには?
-
[解決済み] PowerShell モジュールを全ユーザーに持続的にインストールする
-
[解決済み] Powershellでギャラリーが利用できないというエラーが発生しました。
-
[解決済み] PowerShellでコマンド出力に改行を追加するにはどうすればよいですか?