Powershell Loop卡在数据流中

时间:2016-06-25 17:48:09

标签: powershell

我创建了一个powershell脚本,它获取文本文件的内容以形成一个数组,遍历列表并在列表中的每个服务器上执行nslookup,然后我需要它输出到txt文件。我可以让它做所有事情,除了将数据输出到输出流和txt文件。

我会告诉你我到目前为止所做的一些代码:)

$serverlist = Get-Content'c:\users\username\desktop\serverlist.txt'

我将它传递给for循环以尝试迭代列表中的每个项目并将其传递给nslookup,以便为列表中的每个服务器执行dns查询。

$serverlist = Get-Content'c:\users\username\desktop\serverlist.txt'

foreach($server in $serverlist)
{
   nslookup $server
}

这实际上在powershell客户端中运行良好。问题是我完全无法通过循环打印到文本文件后,无法从控制台获取输出。

我正在处理大量的查找,这就是我处理这个脚本的原因。

我已经尝试过write-host,我已经尝试了out-file而我尝试了script > domainlist.txt但没有用。

我怀疑它卡在数据流中并且不知道去哪里。

我甚至尝试过以下内容:

$serverlist = Get-Content'c:\users\username\desktop\serverlist.txt'
$domainlist = Out-file -path 'c:\users\username\desktop\domainlist.txt'
foreach($server in $serverlist)
{
  nslookup $server
}

script > $domainlist.

我已经尝试通过isesteroids中的循环将其分解,这有很大帮助,但它并没有告诉我数据流可能会发生什么。

2 个答案:

答案 0 :(得分:0)

直接输出到循环体内的文件:

foreach($server in $serverlist)
{
    nslookup $server |Out-File C:\output.txt -Append
}

答案 1 :(得分:0)

PowerShell容易混淆地有两个不同的foreach结构。您在上面使用了foreach ($var in $collection)语句,并且有Foreach-Object cmdlet。

# Statement foreach
foreach($server in $serverlist) {
  nslookup $server
}

# Same loop using cmdlet foreach.  
# The current item is stored in the special variable $_
$serverlist | Foreach-Object {
  nslookup $_
}

您无法重定向输出的原因是语句foreach不会输出到PowerShell管道。 解决此问题的一种方法是切换到cmdlet foreach。

解决此问题的另一种方法是直接重定向nslookup的输出,而不是使用>>追加重定向运算符重定向整个循环。

del domainlist.txt
foreach($server in $serverlist) {
  nslookup $server >> domainlist.txt
}

每次运行时,nslookup.exe的输出都会添加到domainlist.txt文件的末尾。

关于nslookup的一个注释:在查找错误时,nslookup命令会向stderr流发送错误,而不是stdout。要捕获这些错误,您需要使用2>&1

将错误流重定向到输出中
nslookup $server 2>&1 >>domainlist.txt

作为旁注:因为PowerShell是一种脚本语言,在换行符上有隐式语句中断,所以你应该养成将开头大括号放在行尾而不是下一行的习惯。如果你的第一行是某种完整的语句,你可能会很难调试问题,因为它没有绑定到下一行的scriptblock。