我正在尝试清理(重新格式化)已提供给我的包含完整域名的服务器列表,以便我可以在其他地方使用它。服务器列表的格式如下:servername.domain.com。我使用import-csv将列表读入变量,并使用format-table命令删除不需要的其他数据列。我的结果命令如下所示:
$l=Import-Csv .\filename.csv | Format-Table TARGET
TARGET是包含服务器名称的列名。
当我使用以下内容删除服务器名称的域名部分时,结果值为" Microsoft"对包含服务器名称的每一行重复。我已经确认正确地将服务器名称读入变量。
$l -replace '(.+?)\..+','$1'
如果变量中只有一个服务器名称,则该命令可以正常工作。我知道我能够在某一点上减少服务器的名称,但我认为那天我的大脑失效并且没有写下我使用的命令。 :(
有什么建议吗?我的最终目标是将命令合并到脚本中以进行计划处理。
答案 0 :(得分:2)
这里有一些注意事项。首先,正如matt所说,对象被格式化命令破坏。只有在尝试获得对象属性的漂亮视图时才使用它们,否则请使用select。
我认为你会不必要地这样做:为什么要扔掉你以后想要的信息?我已经意识到我已经意识到我可以用我刚刚编写的脚本或函数做一些新的和有用的事情的次数,如果我只是稍微扩展一下。
导入.csv文件时,可以使用列标题的属性名创建对象,因此您可以稍后通过名称引用该属性。
你对replace命令的问题与你需要循环遍历$l
中存储的对象这一事实有关,当有多个时,Foreach-Object
会这样做。
因此,对于文件servers.csv:
TARGET,VALUE2,VALUE3
server1.domain.com,2,3
server2.domain.com,2,3
server3.domain.com,2,3
server4.domain.com,2,3
server5.domain.com,2,3
导入为我们提供了一个很好的对象数组(在表格中格式很好):
Import-Csv .\servers.csv | ft -a
TARGET VALUE2 VALUE3
------ ------ ------
server1.domain.com 2 3
server2.domain.com 2 3
server3.domain.com 2 3
server4.domain.com 2 3
server5.domain.com 2 3
我们可以使用Foreach-Object(%是别名)来获取每个对象的'TARGET'属性(相当于文件中的每一行),使用'Split'方法分割FQDN的点和然后采取该分裂的第一个标记:
Import-Csv .\servers.csv | % {$_.TARGET.Split('.')[0]}
server1
server2
server3
server4
server5
您可以先导入变量,然后根据需要将其传递给循环。
干杯
答案 1 :(得分:0)
始终:如果您打算进行数据操作,请删除| Format-Table TARGET
,因为它会破坏对象。
一种方法是提取您可以处理的列TARGET
的字符串数组。
$l=Import-Csv .\filename.csv | Select -Expand TARGET
假设您有一个正确形成的CSV,您的代码可以简化。既然它不需要正则表达式,你也可以这样做。
$l=Import-Csv .\filename.csv | Select -Expand TARGET | ForEach-Object{$_ -Split "." | Select -First 1}
此时 $l
应仅包含服务器名称。你的正则表达式并没有错,但是为了使用它,你必须对它进行优化或在类似于我-split
的循环中使用它。
$l=Import-Csv .\filename.csv | Select -Expand TARGET
$l | ForEach-Object{$_ -replace '(.+?)\..+','$1'}