0

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

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

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

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

Вручную вводить имена pc в «Get-Printer» отлично работает, и я на самом деле написал рабочий скрипт, который выводит результаты сетевого представления в 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 

ответ

1

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

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

Что-то, как это должно работать:

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

The Get-Printer cmdlet does except pipeline input directly, так что это должно работать, а также (без необходимости явного ForEach-Object):

Get-AdComputer -Filter * | Get-Printer 
+0

Ahh, что делает много смысла & объясняет, почему мой обходной путь был эффективным. Однако у меня есть новая проблема; Кажется, что запуск кода успешно, пока я не ударил машину без запуска службы спулера принтера. Затем он висит бесконечно. Есть ли способ добавить тайм-аут к этому запросу и перейти к следующему компьютеру в списке? Эта проблема отсутствовала в моем коде тренировки, потому что Get-AdComputer возвращает гораздо больший список устройств, чем сетевой вид, включая многие, которые не запускают службу спулера. – evansmtihc

+0

Get-Printer не поддерживает параметр таймаута. Я ожидал бы, что у него будет разумное значение тайм-аута. Вы уверены, что он никогда не вернется или не займет слишком много времени? Если вы используете мой второй пример, то Get-Printer может выполнять несколько вызовов одновременно, что будет затруднять задержки. –

Смежные вопросы