Jestem względnie nowy w PowerShell i mam skrypt, który odczytuje plik konfiguracyjny, który daje zestaw par wartości nazw, które chciałbym przekazać jako argumenty do funkcji w drugi skrypt PowerShell.Inwokuj drugi skrypt z argumentami ze skryptu
Nie wiem, jakie parametry zostaną umieszczone w tym pliku konfiguracyjnym w czasie projektowania, więc w miejscu, w którym muszę wywołać ten drugi skrypt PowerShell, po prostu mam tylko jedną zmienną, która ma ścieżkę do tego drugiego skryptu i druga zmienna, która jest tablicą argumentów do przekazania do skryptu zidentyfikowanego w zmiennej ścieżki.
więc zmienna zawierająca ścieżkę do drugiego scenariusza ($ scriptpath), może mieć wartość jak:
"c:\the\path\to\the\second\script.ps1"
zmienna zawierająca argumenty ($ argumentList) może wyglądać tak:
-ConfigFilename "doohickey.txt" -RootDirectory "c:\some\kind\of\path" -Max 11
Jak przejść z tego stanu rzeczy do wykonywania script.ps1 z wszystkimi argumentami z $ argumentList?
Chciałbym, aby wszystkie komendy write-host z tego drugiego skryptu były widoczne na konsoli, z której wywoływany jest ten pierwszy skrypt.
Próbowałem dot-sourcing, Invoke-Command, Invoke-Expression i Start-Job, ale nie znalazłem podejście, które nie powoduje błędów.
Na przykład, myślałem, że najłatwiej Pierwsza trasa była próba Start-Job nazywa się następująco:
Start-Job -FilePath $scriptPath -ArgumentList $argumentList
... ale to nie z tego błędu:
System.Management.Automation.ValidationMetadataException:
Attribute cannot be added because it would cause the variable
ConfigFilename with value -ConfigFilename to become invalid.
... w tym przypadku "ConfigFilename" jest pierwszym parametrem na liście param zdefiniowanym przez drugi skrypt, a moje wywołanie najwyraźniej próbuje ustawić jego wartość na "-ConfigFilename", co oczywiście ma na celu zidentyfikowanie parametru po nazwie, nie jest ustawione jego wartość.
Czego mi brakuje?
EDIT:
Ok, o to mock-up z do-nazwie skryptu w pliku o nazwie 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
... i tu jest mock-up skryptu wywołującego, w pliku o nazwie invokee.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
Kiedy biegnę invoker.ps1, jest to błąd jestem obecnie dostać się na pierwsze wezwanie do wywoływania ekspresji:
Invoke-Expression : You must provide a value expression on
the right-hand side of the '-' operator.
Drugie wywołanie działa dobrze, ale jedna istotna różnica jest taka, że pierwsza wersja używa argumentów, których ścieżki mają spacje w nich, a drugi nie. Czy niewłaściwie obchodzę obecność przestrzeni na tych ścieżkach?
Pomoże Ci również, jeśli podasz źródło dla każdego ze skryptów. Na przykład utwórz projekt POC (proof of concept) ilustrujący twój problem. Możemy przetestować i grać z nim, a może ktoś znajdzie rozwiązanie lub obejście problemu. – Neolisk
Tak - próbuję odmalować mini wersję do zilustrowania. Wkrótce opublikuje ... – Hoobajoob