0

도메인의 모든 컴퓨터 목록을 가져온 다음 Get-Printer를 실행하여 설치된 모든 프린터 목록을 가져 오는 짧은 스크립트를 작성하려고합니다. 각 기계에. 내가 Powershell 4 파이핑 및 Get-Printer 상호 작용

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

을 시도 있도록

내가 "NET VIEW"를 사용하고자하는 도메인에있는 컴퓨터의 목록을 얻으려면하지만 그것은 작동하지 않습니다. 대신 나는 네트 뷰에서 각 PC에 대해 "스풀러 서비스가 도달 할 수 없습니다"라는 줄을 얻습니다.

"Get-Printer"에 수동으로 PC 이름을 입력하면 텍스트에서 PC 이름을 검색 한 후 .txt 파일에 net view의 결과를 출력하는 작업 스크립트를 실제로 작성한 다음 각 줄을 읽습니다 텍스트 파일에서 "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 cmdlet Get-AdComputer을 사용하여 도메인에 참가한 컴퓨터 목록을 PowerShell 개체로 가져와 파이프 라인에 공급할 수 있습니다.

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

The Get-Printer cmdlet does except pipeline input directly를, 그래서 이것은 (명시를 ForEach-객체에 대한 필요없이) 잘 작동한다 :

이런 식으로 뭔가 작업을해야합니다

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

아 많은 이해 왜 내 해결 방법이 효과적 이었는지 설명합니다. 그러나 나는 새로운 문제가있다. 프린터 스풀러 서비스를 실행하지 않고 컴퓨터에 충돌 할 때까지 코드 실행이 성공한 것 같습니다. 그런 다음 무기한 중단됩니다. 해당 쿼리에 시간 초과를 추가하고 목록의 다음 PC로 이동할 수있는 방법이 있습니까? Get-AdComputer가 스풀러 서비스를 실행하지 않는 많은 네트워크 뷰를 포함하여 net 뷰보다 훨씬 더 많은 장치 목록을 반환하기 때문에이 코드는 내 운동 코드와 관련이 없습니다. – evansmtihc

+0

Get-Printer가 시간 초과 매개 변수를 지원하지 않는 것 같습니다. 합리적인 시간 제한 값이 내장되어 있기를 기대합니다. 결코 돌아 오지 않거나 오래 걸릴 것이라고 확신합니까? 두 번째 예제를 사용하는 경우 Get-Printer는 동시에 여러 번 호출 할 수 있습니다. –