Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何从数组中提取数据值并作为变量输入_Powershell_Csv_Variables - Fatal编程技术网

Powershell 如何从数组中提取数据值并作为变量输入

Powershell 如何从数组中提取数据值并作为变量输入,powershell,csv,variables,Powershell,Csv,Variables,我想加载一个csv与服务器的和每个服务器的ID。第1列是服务器名称,第2列是ID字符串。将有40台服务器,每个服务器都有一个特定的ID字符串。在我的脚本中,我想提取主机名,然后在数组中搜索它。找到后,我想将服务器名称对应的ID输出到一个变量中。我对powershell非常陌生,所以请记住这一点。我最擅长用例子来解决问题 $Server = @() $ID = @() Import-Csv C:\SecuredFiles\ID.csv | ForEach-Object {$Server += $

我想加载一个csv与服务器的和每个服务器的ID。第1列是服务器名称,第2列是ID字符串。将有40台服务器,每个服务器都有一个特定的ID字符串。在我的脚本中,我想提取主机名,然后在数组中搜索它。找到后,我想将服务器名称对应的ID输出到一个变量中。我对powershell非常陌生,所以请记住这一点。我最擅长用例子来解决问题

$Server = @()
$ID = @()

Import-Csv C:\SecuredFiles\ID.csv | ForEach-Object {$Server += $_.Server ; 
$ID += $_.ID}

$ServerName = Invoke-Command -ScriptBlock {hostname}

if ($Server -contains $ServerName)
  {
    $Where = [array]::IndexOf($Server, $ServerName)
    $InputID = $ID[$Where]
  }

Start-Process -FilePath 'C:\MyFolder\App.exe' "-id $InputID -d C:\MyFolder"
我已经钻研了几个小时,我知道我工作比需要的更努力,但我很固执,喜欢自己找到答案,但我迷路了,而且有偏头痛,哈哈,也许我做得完全错了


我尝试了不同的格式,但得到了不同的错误,如“语句块中缺少结尾“}”或“类型定义”,尽管它显然存在。但我当前的错误是“if”语句开头的“if(condition)之后缺少语句块”。非常感谢您的帮助。

这里有一种方法可以从导入的CSV文件中获取系统ID

# fake reading in a CSV file
#    in real life, use Import-CSV
$InStuff = @"
Name, ID
Srv001, 1001
Srv002, 2002
Srv003, 3003
Srv004, 4004
Srv005, 5005
$env:COMPUTERNAME, 6006
Srv007, 7007
"@ | ConvertFrom-Csv

($InStuff -match $env:COMPUTERNAME).ID

output=
6006

导入您的CSV,然后使用它返回的自定义对象实例更容易、更高效:

# Import into an array of custom objects ([pscustomobject]) that have
# both a .Server and an .ID property.
$serversAndTheirIds = Import-Csv C:\SecuredFiles\ID.csv
具体来说,使用
+=
迭代构建输出数组非常有效,因为数组是不可变的数据结构,“添加”到它们意味着每次都必须在幕后分配新数组


无需使用
Invoke命令
来同步调用控制台应用程序-直接调用应用程序即可


使用
Where Object
cmdlet或PSv4+
。Where()
方法筛选集合:

$inputId = $serversAndTheirIds | Where-Object { $_.Server -eq $ServerName } | 
  Select-Object -ExpandProperty ID
更高效的PSv4+替代方案:

$inputId = $serversAndTheirIds.Where({ $_.Server -eq $ServerName }, 'First' }).ID

同样,要同步调用另一个控制台应用程序,请直接调用它:

C:\MyFolder\App.exe -id $InputID -d C:\MyFolder
注意:如果引用了可执行路径,则需要预先添加

仅用于调用GUI应用程序,或异步或隐藏运行程序


至于你的语法问题:

在撰写本文时,您问题中发布的代码在语法上是正确的,不会导致您引用的错误消息

以下是导致他们的原因:

语句块或类型定义中缺少结束“}”

没有关闭的脚本块(
{…}
)将触发此错误;e、 例如,如果您的脚本仅包含以下内容:

 { 'foo'   # no closing '}'
 if ($true) # no script block ({ ... }) to follow the conditional
if(条件)后缺少语句块

如果
if
语句后面没有脚本块,则会触发此错误;e、 例如,如果您的脚本仅包含以下内容:

 { 'foo'   # no closing '}'
 if ($true) # no script block ({ ... }) to follow the conditional

为什么要把它从阵列中拉出来?在适当的位置使用它,您就不需要管理额外的变量。那么,系统如何知道在参数列表中使用哪个Id呢?我不需要它进行搜索和匹配,然后提取关联的ID吗?如果知道该项在数组中的位置,只需通过
$Collection[$Index]引用即可。参数
。你的方法可行,但似乎是多余的一步。但是,使用最适合您思考问题的方式!你是那个必须维护它的人。。。[咧嘴笑]我很感谢你给我的大量信息,尽管我对其中的一些信息并不完全理解,但我仍然非常感激。我和我的导师一起,帮助我看建议,进一步解释你给我的东西的来龙去脉,以便我理解我输入特定代码的内容和原因。至于错误,我正在使用Visual Studio代码,这可能会导致这些错误吗?我可能会打开一个工作区,这样你就可以看到它,这些就是我遇到的错误,或者这与我使用PS5.1有关?我很高兴听到这个消息,@Kameron。不,无论是使用Visual Studio代码还是使用v5.1都不能解释这些错误。