2014-09-12 133 views
0

我有一个令我不安的问题。Powershell从文件传递命名参数

我想自动执行powershell脚本命名参数,但在另一个powershell脚本(这将作为脚本deamon)。

例如:

一说被调用的脚本有这个参数

param(
[int]$version, 
[string]$user, 
[string]$pass, 
[string]$domain, 

PowerShell脚本守护进程现在加载文件和参数,像这样

$argumentsFromScript = [System.IO.File]::ReadAllText("C:\params.txt") $job = Start-Job { & "ps1file" $arguments} 

params.txt包含这样的数据

-versionInfo 2012 -user admin -pass admin -domain Workgrup 

但是,当我尝试执行此代码显然整个$ argumentsFromScript变量将被视为参数1(版本)和我结束了一个错误,即“-versionInfo 2012 - 用户管理-pass管理 - 域的Workgrup“不能转换为Int32 ...

你们有什么想法我可以如何完成这项任务? Powershell deamon不知道任何有关参数。他只需要使用给定的命名参数执行脚本。 params.txt只是一个例子。任何其他文件(csv,ps1,xml等)都可以,我只想自动获取传递给脚本的命名参数。

感谢您预先的任何帮助或建议..

回答

1

试试这个:

@' 
param ([string]$logname,[int]$newest) 
get-eventlog -LogName $logname -Newest $newest 
'@ | sc c:\testfiles\testscript.ps1 

'-logname:application -newest:10' | sc c:\testfiles\params.txt 

$script = 'c:\testfiles\testscript.ps1' 
$arguments = 'c:\testfiles\params.txt' 

$sb = [scriptblock]::Create("$script $(get-content $argumentlist)") 

Start-Job -ScriptBlock $sb 
+0

谢谢您的解决方案:) – 2014-09-17 06:17:53

0

我想你想的:

$ps1 = (Resolve-Path .\YourScript.ps1).ProviderPath 
$parms = (Resolve-Path .\YourNamedParameters.txt).ProviderPath 

$job = sajb -ScriptBlock { 
    param($ps1,$parms) 
    iex "$ps1 $parms" 
} -ArgumentList @(
    $ps1, 
    [string](gc $parms) 
) 

# if you wanna see the outcome 
rcjb $job -Wait 
+0

那可悲的是导致了同样的例外,但我知道你的努力背后的想法。谢谢 – 2014-09-15 06:10:13

+0

随意使用任何你想要的,但我只是再次运行它,它运行得很好。 – 2014-09-16 23:35:48