Конвейер Powershell 4 и взаимодействие Get-Printer

Я пытаюсь написать короткий сценарий, который получит список всех компьютеров в домене, а затем запустит на них Get-Printer, чтобы получить список всех установленных принтеров на каждой машине.

Чтобы получить список компьютеров в домене, я хотел бы использовать «net view», поэтому я попытался

net view | ForEach-Object {Get-Printer -ComputerName $_}

Но это не работает. Вместо этого я просто получаю строку «Служба диспетчера очереди недоступна» для каждого ПК в сетевом представлении.

Ручной ввод имен ПК в «Get-Printer» работает отлично, и я действительно написал рабочий скрипт, который выводит результаты net view в файл .txt после поиска имен ПК в тексте, а затем считывает каждую строку из текстового файла. и последовательно вводит их в «Get-Printer». Но я хотел бы иметь возможность расширить этот код для централизованного управления принтерами, поэтому мне нужно, чтобы это работало из одной строки, что, я думаю, возможно.

Может ли кто-нибудь объяснить, что мне здесь не хватает? Как на самом деле работает ForEach в Powershell 4?

Ниже приведен мой рабочий код, который записывает в файл, а затем читает из него:

$PCs = net view /all | Select-String "\\"

$a = ForEach ($Line in $PCs)

{   $Line -Replace(" ","")

}

$a | Out-file -FilePath C:\Users\esmith\Desktop\test.txt -Encoding ascii

Get-content C:\Users\esmith\Desktop\test.txt | ForEach-Object {Get-Printer -cn $_} | Out-file -FilePath C:\Users\esmith\Desktop\output.txt

person evansmtihc    schedule 27.07.2016    source источник


Ответы (1)


net view — это командная строка DOS, которая возвращает текстовый вывод. Конвейер PowerShell работает с объектами, а не с текстом, поэтому в данном случае это плохо сочетается. (Технически: строки также являются объектами, но не теми объектами, которые вы ожидаете здесь).

Вы можете использовать собственный командлет PowerShell Get-AdComputer для получения списка доменов. присоединенные компьютеры как объекты PowerShell, которые затем можно передать в конвейер.

Что-то вроде этого должно работать:

Get-AdComputer -Filter * | ForEach-Object { Get-Printer -ComputerName $_.Name }

Командлет Get-Printer выполняет непосредственный ввод конвейера, кроме ввода , так что это тоже должно работать (без необходимости явного ForEach-Object):

Get-AdComputer -Filter * | Get-Printer
person oɔɯǝɹ    schedule 27.07.2016
comment
Ах, это имеет большой смысл и объясняет, почему мой обходной путь оказался эффективным. Однако у меня есть новая проблема; Кажется, что ваш код работает успешно, пока я не столкнусь с машиной без запущенной службы диспетчера очереди печати. Потом висит на неопределенный срок. Есть ли способ добавить тайм-аут к этому запросу и перейти к следующему компьютеру в списке? Этой проблемы не было с моим кодом тренировки, потому что Get-AdComputer возвращает гораздо больший список устройств, чем net view, включая многие из них, на которых не запущена служба очереди печати. - person evansmtihc; 28.07.2016
comment
Get-Printer не поддерживает параметр времени ожидания. Я ожидаю, что он будет иметь разумное значение тайм-аута. Вы уверены, что он никогда не возвращается или просто занимает (слишком) много времени? Если вы используете мой второй пример, то Get-Printer может выполнять несколько вызовов одновременно, что устраняет задержки. - person oɔɯǝɹ; 28.07.2016