2013-07-14 4 views
0

Основной вопрос - но почему в сценарии Powershell Get-Service не распечатывает список на выходе?Get-Service в сценарии Powershell

Write-Host "Enumerating installed Services..." -ForegroundColor Green 
    Get-Service | Sort-Object status,displayname 

Теперь в скрипте он не дает никакого вывода.

Но если я открыл запрос powershell и набрал его вручную, он отлично работает.

Полный скрипт:

param([string] $server) 

$serverSystem = Get-WmiObject -computername $env:computername Win32_ComputerSystem 
$serverCPUDetail = Get-WmiObject -ComputerName $env:computername Win32_Processor 

switch ($ComputerSystem.DomainRole){ 
     0 {$ComputerRole = "Standalone Workstation"} 
     1 {$ComputerRole = "Member Workstation"} 
     2 {$ComputerRole = "Standalone Server"} 
     3 {$ComputerRole = "Member Server"} 
     4 {$ComputerRole = "Domain Controller"} 
     5 {$ComputerRole = "Domain Controller"} 
     default {$ComputerRole = "No role available" } 
    } 


$serverOS = Get-WmiObject -class Win32_OperatingSystem -ComputerName $env:computername 

Write-Host "Enumerating System information..." -ForegroundColor Green 
" " 
Start-Sleep -s 1 
Write-Host "Hostname:" ($env:computername) 
Write-Host "Domain:" ($serverSystem.Domain) 
Write-Host "Role:" ($ComputerRole) 
Write-Host "Operating System:" ($serverOS.Caption) 
Write-Host "Service Pack:" ($serverOS.CSDVersion) 
$lastBootTime = $serverOS.ConvertToDateTime($serverOS.Lastbootuptime) 
Write-Host "Last Boot Time:" $lastBootTime 
" " 
Write-Host "Enumerating Hardware information..." -ForegroundColor Green 
" " 
Start-Sleep -s 1 
Write-Host "Model:" ($serverSystem.Model) 
Write-Host "Manufacturer:" ($serverSystem.Manufacturer) 
Write-Host "CPU - No. of Processors:" ($serverSystem.NumberOfProcessors) 
Write-Host "CPU - No. of Cores:" ($serverCPUDetail.NumberofCores) 
Write-Host "CPU - No. of Processors, Logical:" ($serverCPUDetail.NumberOfLogicalProcessors) 
Write-Host "Memory in GB:" ([math]::round($serverSystem.TotalPhysicalMemory/1024/1024/1024,0)) 

" " 
Write-Host "Enumerating Disk Information..." -ForegroundColor Green 
Start-Sleep -s 1 
Foreach ($s in $env:computername) { 
    Get-WmiObject -Class win32_volume -cn $s | 
    Select-Object @{LABEL='Comptuer';EXPRESSION={$s}},DriveLetter, Label,@{LABEL='Free Space (GB)';EXPRESSION={"{0:N2}" -f ($_.freespace/1GB)}} 
} 
" " 
Write-Host "Enumerating Network Information..." -ForegroundColor Green 
" " 
Start-Sleep -s 1 
ForEach($NIC in $env:computername) { 
    $intIndex = 1 
    $NICInfo = Get-WmiObject -ComputerName $env:computername Win32_NetworkAdapterConfiguration | Where-Object {$_.IPAddress -ne $null} 
    $caption = $NICInfo.Description 
    $ipAddress = $NICInfo.IPAddress 
    $ipSubnet = $NICInfo.IpSubnet 
    $ipGateWay = $NICInfo.DefaultIPGateway 
    $macAddress = $NICInfo.MACAddress 
    Write-Host "Network Card": $intIndex 
    Write-Host "Interface Name: $caption" 
    Write-Host "IP Addresses: $ipAddress" 
    Write-Host "Subnet Mask: $ipSubnet" 
    Write-Host "Default Gateway: $ipGateway" 
    Write-Host "MAC: $macAddress" 
    $intIndex += 1 
} 
" " 
# Write-Host "Enumerating Software Installations..." -ForegroundColor Green 
# " " 
# Get-WmiObject -Class Win32_Product | Select-Object -property Name 

Write-Host "Enumerating installed Services..." -ForegroundColor Green 
Get-Service | Sort-Object status,displayname 
+0

Что вы пытаетесь сделать? Как вы упомянули в своем вопросе, он отлично работает, в чем проблема? –

+0

В основном в скрипте ничего не печатается, но если я открою подсказку командной строки вручную, она отлично работает. – PnP

+0

Нет проблем с этими двумя строками. Они производят выходные данные внутри или вне сценария. Это что-то еще, что вы не показываете, что вызывает проблемы. Пожалуйста, разместите свой сценарий и, пожалуйста, напишите, как вы его называете. –

ответ

2

Код, который вы вывесили в порядке. Это что-то еще, что вы не показываете, что это не работает.

Попробуйте это:

$script = @" 
Write-Host "Enumerating installed Services..." -ForegroundColor Green 
Get-Service | Sort-Object status,displayname 
"@ 

$script | Set-Content ./test.ps1 
./test.ps1 

выше пишет свои две строки в файле сценария, а затем выполняет сценарий. Как и следовало ожидать, он производит желаемый результат.

Update 1

Увидев вход, теперь я могу воспроизвести проблему. В принципе, если вы запустите это:

$a= Get-WmiObject -Class win32_volume -cn $s | 
    Select-Object @{LABEL='Comptuer';EXPRESSION={$s}},DriveLetter, Label,@{LABEL='Free Space (GB)';EXPRESSION={"{0:N2}" -f ($_.freespace/1GB)}} 
$b = Get-Service | Sort-Object status,displayname 
$a 
$b 

вы увидите, что он не совсем работает. Здесь происходит то, что по умолчанию Write-Output используется для обработки результатов. Write-Output записывает материал в конвейер успеха, и powershell делает разворачивание массивов. Тогда я предполагаю, что выходная система не может справиться с тем, что вывод get-service и select-object имеет разные типы (и из-за разворачивания они попадают в один и тот же массив).

Если вы измените последнюю строку вашего сценария

Get-Service | Sort-Object status,displayname | ft 

он будет работать. Однако обратите внимание, что если вы собираетесь передавать результаты своего сценария, лучше отформатировать его (футы) в самом конце перед отображением. В принципе, после того, как вы отправили его на ft, редко есть веская причина передать его куда угодно, кроме вывода (отображения или файла).

Update 2

This article объясняет, что использует PowerShell первый объект в потоке, чтобы определить, как форматировать их все. Это объясняет поведение, которое мы наблюдаем.

+0

Я добавил полный скрипт, но я не вижу, как что-то еще повлияет на эту команду, оно находится в собственном пространстве – PnP