繁体   English   中英

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

[英]How to call a Powershell script using batch script and pass an object array

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

我的问题是将服务器列表从数组变量传递到另一个称为重新启动的脚本。 见下文;

批处理脚本以调用和绕过ps1executionPolicy(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"

如果我运行此命令,则数组内容如下所示:$ NSRVList变量在PingRBAuthPass.ps1中输出whiles

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

变量$ NSRVList输出,而在reboot.ps1中

@{ENVName=RND; FND=srv003529; DB=srv002983; APPS=srv003528}

我希望数组的结构保持完整。

我相信您的困惑源于您相信$ 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   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM