none
Уменьшение времени отработки скрипта RRS feed

  • Вопрос

  • День добрый. Тело скрипта:

    New-Item -Path D:\1.csv -type file
    Add-Content D:\1.csv "sep=,"
    Add-Content D:\1.csv (Get-ADComputer -filter "Name -like 'w*'" -SearchBase "OU=мойдомен,DC=contoso,DC=com"| Select DistinguishedName,@{n="Status";e={(gsv -Name WinRm -ComputerName $_.DnsHostName).Status}})|Where {$_.Status -eq "Stopped"}

    Как я понимаю, в основе get-adcomputer лежит создание новой сессии, следовательно этот командлет должен принимать параметр sessiooption. Но он не принимает. Работа происходит, по предварительным подсчетам, с ~60 объектами. Почему так и как можно уменьшить время отработки скрипта, который использует get-adcomputer в качестве основы?

Ответы

  • Нет, понимаете неправильно, никаких сессий не создается. Проблема в очень медленной работе gsv , да еще и в не параллельном режиме, задержка может составлять до 1 минуты для 1 пк. Можно воспользоваться workflow, что уменьшит время отработки.

    $computers = Get-ADComputer -filter "Name -like 'w*'" -SearchBase "OU=мойдомен,DC=contoso,DC=com"
    
    workflow Get-WinRmStatus {
    	param($ComputerName)
    	
    	foreach -parallel($computer in $ComputerName) { 
    		InlineScript {
    			Get-Service -Name WinRm -ComputerName $using:computer.DNSHostName -ErrorAction SilentlyContinue | Where-Object -FilterScript {$_.Status -eq "Stopped"} | Foreach-Object -Process {$using:computer.DistinguishedName}
    		}
    	}
    	
    }
    
    Get-WinRmStatus $computers | Select @{n="DistinguishedName";e={$_}},@{n="Status";e={"Stopped"}}

    Получение данных через WMI и отработка ошибок происходит быстрее:

    $computers = Get-ADComputer -filter "Name -like 'w*'" -SearchBase "OU=мойдомен,DC=contoso,DC=com"
    
    workflow Get-WinRmStatus {
    	param($ComputerName)
    	
    	foreach -parallel($computer in $ComputerName) { 
    		InlineScript {
    			Get-WmiObject Win32_Service -Filter "Name='WinRm' and State='Stopped'" -ComputerName $using:computer.DNSHostName -ErrorAction SilentlyContinue  | Foreach-Object -Process {$using:computer.DistinguishedName}
    		}
    	}
    	
    }
    
    Get-WinRmStatus $computers | Select @{n="DistinguishedName";e={$_}},@{n="Status";e={"Stopped"}}

    • Помечено в качестве ответа Net Ranger 29 мая 2015 г. 7:34
    Отвечающий

Все ответы

  • Нет, понимаете неправильно, никаких сессий не создается. Проблема в очень медленной работе gsv , да еще и в не параллельном режиме, задержка может составлять до 1 минуты для 1 пк. Можно воспользоваться workflow, что уменьшит время отработки.

    $computers = Get-ADComputer -filter "Name -like 'w*'" -SearchBase "OU=мойдомен,DC=contoso,DC=com"
    
    workflow Get-WinRmStatus {
    	param($ComputerName)
    	
    	foreach -parallel($computer in $ComputerName) { 
    		InlineScript {
    			Get-Service -Name WinRm -ComputerName $using:computer.DNSHostName -ErrorAction SilentlyContinue | Where-Object -FilterScript {$_.Status -eq "Stopped"} | Foreach-Object -Process {$using:computer.DistinguishedName}
    		}
    	}
    	
    }
    
    Get-WinRmStatus $computers | Select @{n="DistinguishedName";e={$_}},@{n="Status";e={"Stopped"}}

    Получение данных через WMI и отработка ошибок происходит быстрее:

    $computers = Get-ADComputer -filter "Name -like 'w*'" -SearchBase "OU=мойдомен,DC=contoso,DC=com"
    
    workflow Get-WinRmStatus {
    	param($ComputerName)
    	
    	foreach -parallel($computer in $ComputerName) { 
    		InlineScript {
    			Get-WmiObject Win32_Service -Filter "Name='WinRm' and State='Stopped'" -ComputerName $using:computer.DNSHostName -ErrorAction SilentlyContinue  | Foreach-Object -Process {$using:computer.DistinguishedName}
    		}
    	}
    	
    }
    
    Get-WinRmStatus $computers | Select @{n="DistinguishedName";e={$_}},@{n="Status";e={"Stopped"}}

    • Помечено в качестве ответа Net Ranger 29 мая 2015 г. 7:34
    Отвечающий
  • Попробовал последний вариант. Посыпались ошибки - Не удается проверить аргумент для параметра "ComputerName". Я так понимаю, это недоступные компьютеры?
    Нет, наибольшая верояность, что код скопирован неправильно.
    Отвечающий
  • Несколько раз проверил. Скопировал правильно. Ошибка подробнее:

    Get-Service : Не удается проверить аргумент для параметра "ComputerName". Аргумент пустой или имеет значение NULL. Укаж
    ите непустой аргумент, не имеющий значение NULL, после чего повторите выполнение команды.
    Get-WinRmStatus:7 знак:7
    +
        + CategoryInfo          : InvalidData: (:) [Get-Service], ParameterBindingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetServiceCommand
        + PSComputerName        : [localhost]

    Как я понял, функция почему-то получает на вход локальное имя моего комп-а, вместо доменного.


  • Еще раз, код скопирован неправильно. При правильно копировании ошибок нет,т.к они подавляются.
    Приведите скриншот с вставленным кодом.
    Отвечающий
  • Скрипт запускать в консоли PowerShell, а не в ISE. За  одно и скриншот, где код и ошибка.

    Переменная $computers - точно содержит данные?

    • Изменено KazunEditor 27 мая 2015 г. 14:00
    Отвечающий
  • $computers точно содержит данные, поскольку команда в переменной, сама по себе, отрабатывает нормально. Я, правда, не совсем понял как правильно запустить Ваш скрипт, либо .\Script1.ps1 с консоли, либо какая-то команда из кода, но результат был всегда один.

  • Переменная $computers - пустая.
    Отвечающий
  • А как переменная может быть пустая, если команда, которая содержит вывод этой команды, сама по себе, отрабатывает нормально?
  • $computers = Get-ADComputer -filter "Name -like 'w*'" -SearchBase "OU=мойдомен,DC=contoso,DC=com"


    Заменить на:

    $computers = Get-ADComputer -filter "Name -like 'w*' -and DNSHostName -like '*'" -SearchBase "OU=мойдомен,DC=contoso,DC=com"

    Отвечающий
  • Увы, не помогло. Во время выполнения скрипта, появляется окошко зеленого цвета, которое ссылается на 7 строку (InlineScript {) и 7 символ.

    С ответом можете не спешить, поскольку ответ на вопрос, который по идее давал бы это скрипт, частично мы получили.