Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
String PowerShell-问题:变量中的整个字符串被传递_String_Powershell_Sysadmin - Fatal编程技术网

String PowerShell-问题:变量中的整个字符串被传递

String PowerShell-问题:变量中的整个字符串被传递,string,powershell,sysadmin,String,Powershell,Sysadmin,我对PowerShell还是新手,希望能有人帮忙 基本上,我们会收到一些IT请求,要求我们向批量服务器本地管理员广告组添加单个用户。我们通常在票据的请求详细信息字段中复制这些服务器名称的指定信息。示例如下: 服务器1服务器2服务器3服务器4 广告示例组如下所示:LocalAdmin.servername.Rights 目标:我们希望将上述每个服务器名称值传递到servername所在的位置。 我所做的工作: $Group = @("server1","server2

我对PowerShell还是新手,希望能有人帮忙

基本上,我们会收到一些IT请求,要求我们向批量服务器本地管理员广告组添加单个用户。我们通常在票据的请求详细信息字段中复制这些服务器名称的指定信息。示例如下:

服务器1服务器2服务器3服务器4

广告示例组如下所示:LocalAdmin.servername.Rights

目标:我们希望将上述每个服务器名称值传递到servername所在的位置。 我所做的工作:

$Group = @("server1","server2")

ForEach ($Group in $Group) {
    Add-ADPrincipalGroupMembership $User -MemberOf LocalAdmin.$Group.Rights
}
问题:在你看到“server1”、“server2”的地方,我不得不在记事本中重新格式化它,添加引号并粘贴进去,这很痛苦,所以为了改进它,我尝试了下面的方法。 什么不起作用: 我成功地将字符串“server1”、“server2”传递给变量$Servers

$Group = @($Servers)

ForEach ($Group in $Group) {
    Add-ADPrincipalGroupMembership $User -MemberOf LocalAdmin.$Group.Rights
}
但我有一个错误:

Add ADPrincipalGroupMembership:找不到标识为“LocalAdmin.”server1“,”server2“.Rights”的对象

我希望用户被添加到每个广告组:LocalAdmin.server1.Rights、LocalAdmin.server2.Rights

但是错误会将其作为LocalAdmin.server1.server2.Rights获取


任何帮助都将不胜感激。谢谢。

看起来$Servers变量是一个类似于
“server1”、“server2”
的字符串,而不是一个包含两个字符串的数组,例如:
@(“server1”、“server2”)
,因此您必须以其他方式组合
$Servers
变量。你有这个变量的代码吗?然后我可以提供更多帮助。

您确定您的
$Servers
变量是好的吗

请尝试以下代码:

$Servers = @("server1","server2")
$Group = @($Servers)

ForEach($Group in $Group){$Group}
比尔,
Adam

您可以根据服务器名称之间的公共分隔符拆分字符串。结果将是一个可以循环的数组

$servers = 'server1,server2,server3'
$serverArray = $servers -split ',' # You could use -split ' ' if servers are space delimited

foreach ($server in $serverArray) {
    Add-ADPrincipalGroupMembership $User -MemberOf "LocalAdmin.$server.Rights"
}
请注意,PowerShell语法
“server1”、“server2”
已经创建了一个数组,因为
在引号之外,因此是一个运算符。当
位于引号之间时,它是字符串的一部分。如果收到包含引号和逗号的输入字符串,则需要拆分该字符串,但也要删除不需要的引号

$inputString = '"server1","server2","server3"'
$serverArray = $inputString -split ',' -replace '"'
foreach ($server in $serverArray) {
    Add-ADPrincipalGroupMembership $User -MemberOf "LocalAdmin.$server.Rights"
}

有关使用正则表达式匹配的
-split
的更多信息,请参阅。它优于
String.Split()
方法,并且没有任何与该方法相关的缺陷。

如果我从您的初始问题和附加注释中理解正确,您将在提示下输入服务器列表

正如你在这里所说的:

$CopyDetails = Read-Host -Prompt "Enter servers name"
问题是,您希望在$Server变量中放入一个字符串数组,其中每个数组项都是列表中的一个服务器

实现这一点的最简单的方法是简单地标记来自行的输入。假设您在前面的提示中粘贴“server1、server2、server3、server4”,那么我们可以按如下方式对其进行标记:

$ServerList = Read-Host -Prompt "Enter servers name"
$Group = @($ServerList.Split(","))

然后,您可以按照最初的意图使用$Group。

让我看看我是否理解您所看到的问题。 您将得到一个未格式化的值列表,如下所示:

服务器1服务器2服务器3服务器4

没有逗号和引号。您希望避免将其格式化为以下格式的麻烦:

服务器1、服务器2、服务器3、服务器4

所以你可以在脚本中使用它

如果我理解正确,恐怕你会失望的。如果要按原样运行脚本,则必须以某种方式操纵文本

减少工作量的一种方法是将服务器列表复制到单独的文本文档中,并添加换行符,以便每个服务器名称在文本文件中占据自己的行。像这样:

服务器1
服务器2
服务器3
服务器4

然后可以修改脚本,使用
Get Content
将文本文件的内容获取到
$Group
变量中


另外,为了清晰起见,我建议您将数组变量命名为
$Groups
,而不是
$Groups
。通过这种方式,
ForEach
条件变得更加可读。

感谢您的回答。是的,这会起作用,但是我必须在记事本中格式化:server1 server2,将其显示为“server1”、“server2”,并将其粘贴到PS中的括号中。我试图避免这样做。是的,听起来你是对的,它是一个完整的字符串。我只是不知道如何使它成为一个数组,同时避免将server1 server2格式化为记事本中的“server1”、“server2”。$Servers的代码:$CopyDetails=Read Host-Prompt“Enter Servers name”#我按原样从票证复制了数据:server1 server2$Bracket=$CopyDetails-replace“”、“”、“”#这会在每个单词之间添加空格和括号,除了开头和结尾。当前结果:server1”、“server2$str1=”“”“$Servers=$str1+$Bracket+$str1最终结果:“server1”、“server2”