如何使用批处理脚本调用Powershell脚本并传递对象数组

时间:2014-05-02 15:55:32

标签: arrays batch-file powershell

我是Powershell脚本编写的新手。我正在尝试编写一个脚本,重新启动服务器列表,ping,检查应用程序服务是否全部启动,然后将RDP重新启动到服务器上。

我的问题是将服务器列表从数组变量传递到另一个我调用reboot的脚本。见下文;

调用和绕过ps1 executionPolicy(ParamBypass.bat)的批处理脚本:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '"%PowerShellScriptPath%"' -ServerList '%2' -SCreD '%3' -SEnv '%4'"

--actual Batch call code : ParamBypass.bat PingRBAuthPass.ps1

Powershell脚本(PingRBAuthPass.ps1):获取服务器列表并将其存储到数组中

$NSRVList = Import-Csv .\SMachines\Servers.csv | Where-Object {$_.ENVName -eq "RND"} | Select-Object -Property ENVName,FND,DB,APPS
ParamBypass.bat /reboot.ps1 $NSRVList

Powershell重启脚本:

param(             
[string[]]$ServerList,
[string]$SCreD,
[string]$SEnv
)
Function Database
{
[Object[]]$RBSrv
$RBSrv = $ServerList
Foreach ($srv in $RBSrv) {
if($srv.DB) {
--do something
   $NSRVList = $RBSrv | Select-Object -Property ENVName,FND,APPS
   } else { & "FND" }
}
}    
& "Database"

如果我运行这个数组的内容,如下所示: PingRBAuthPass.ps1中的变量$ NSRVList输出

ENVName FND       DB        APPS
------- ---       --        ----
RND     srv003529 srv002983 srv003528
RND                         srv003527
RND                         srv003526
RND                         srv003530

在reboot.ps1

中输出变量$ NSRVList
@{ENVName=RND; FND=srv003529; DB=srv002983; APPS=srv003528}

我希望数组的结构保持不变。

1 个答案:

答案 0 :(得分:0)

我相信你的困惑源于你相信$ NSRVList是一个字符串数组。但是,如果你看下面的例子;你会看到它实际上是一个自定义对象

so_question.csv的内容

ENVName,FND,DB,APPS
RND,srv003529,srv002983,srv003528
RND,,,srv003527
RND,,,srv003526
RND,,,srv003530

调用import-csv

PS C:\Users\sqlchow\Desktop> $a = Import-Csv .\so_question.csv

PS C:\Users\sqlchow\Desktop> $a  #uses the default display format for objects

ENVName                       FND                           DB                            APPS                         
-------                       ---                           --                            ----                         
RND                           srv003529                     srv002983                     srv003528                    
RND                                                                                       srv003527                    
RND                                                                                       srv003526                    
RND                                                                                       srv003530                    

但实际上$ a实际上是一个自定义对象

PS C:\Users\sqlchow\Desktop> write-host $a
@{ENVName=RND; FND=srv003529; DB=srv002983; APPS=srv003528} @{ENVName=RND; FND=; DB=; APPS=srv003527} @{ENVName=RND; FND
=; DB=; APPS=srv003526} @{ENVName=RND; FND=; DB=; APPS=srv003530}

PS C:\Users\sqlchow\Desktop> $a | gm


   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition                    
----        ----------   ----------                    
...
...
APPS        NoteProperty System.String APPS=srv003528  
DB          NoteProperty System.String DB=srv002983    
ENVName     NoteProperty System.String ENVName=RND     
FND         NoteProperty System.String FND=srv003529