【问题标题】:How to call a Powershell script using batch script and pass an object array如何使用批处理脚本调用 Powershell 脚本并传递对象数组
【发布时间】:2017-09-23 18:54:50
【问题描述】:

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

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

调用和绕过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 Script (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}

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

【问题讨论】:

  • 有什么原因不能将所有内容合并到一个脚本中吗?
  • 很好:维护更容易。我也不熟悉 powershell 的稳健性以及它可以在一个脚本中处理多少行代码。所以选择了这种编码方式。

标签: arrays batch-file powershell


【解决方案1】:

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

【讨论】:

  • 我正在考虑使用文件在它们上写入新的数组列表并不断更新它们,直到我完成该过程。有没有办法将 PSCustomObject 转换为任何数组或更好地将 .csv 文件加载到数组中。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2013-10-10
  • 2023-01-23
  • 1970-01-01
相关资源
最近更新 更多