Задать вопрос
@Vlrkmt

Как правильно написать powershell-скрипт для поиска папки по всем компьютерам в сети?

Добрый день!

Имею на руках скрипт для поиска папки 1с по компьютерам в сети вот такого формата:

param (
    $listFilePath = 'd:\tmp\list.txt', #Сюда файл со списком
    $reportFilePath = 'd:\tmp\out.txt' #Тут будет отчет
)
 
Get-Content $listFilePath | ForEach-Object{
        ("$_ bad \\$_\c$\Program Files (x86)\1cv8\", "$_ good")[(Test-Path "\\$_\c$\Program Files (x86)\1cv8\8.3.22.1750")]
} | out-file $reportFilePath


Список то с компьютерами я выгрузил из AD и положил в фаил, но вот не всегда все компьютеры из списка находятся в сети, отчего в конечном отчёте он пишет, что папка на данных компьютерах отсутствует, что логично, но не совсем корректно. Хотелось бы дописать скрипт так, чтобы он опрашивал список компьютеров в течении определенного времени (например, 10 секунд) и если ответа за 10 секунд не поступило, то он бы вписывал в отчёт информацию об этом ПК, как "PASS", например.

Это и увеличит скорость проверки и будет понятно, что, например, данные ПК просто выключены (или ещё что), но не могу придумать даже как это реализовать, поэтому очень прошу помощи.
  • Вопрос задан
  • 541 просмотр
Подписаться 2 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@FluffyBeaver
Проверить доступность компьютеров можно, например, так:
Get-ADComputer -Filter 'OperatingSystem -notlike "*Server*"' | ForEach-Object -Process {
    if (Test-NetConnection -ComputerName $PSItem.DnsHostName -InformationLevel Quiet) {
        Write-Host $PSItem.Name 'доступен' -ForegroundColor Green
    }
    else {
        Write-Host $PSItem.Name 'НЕдоступен' -ForegroundColor Yellow
    }
}


Перечитал вопрос - там что-то про поиск версии 1С. Видимо, проверяется, стоит 1с нужной версии или нет.
Если речь об этом, можно просто проверить, стоит ли 1С применю так:
# Установка
$InstalledPackage = Get-Package -Name '1*:Предприятие 8*' -RequiredVersion $PlatformVersion -ErrorAction SilentlyContinue
if ($InstalledPackage) {
    ##TODO Уже установлена
}
else {
    ##TODO Вывод в лог 'Запускаем установку версии' $PlatformVersion
    Start-Process -FilePath 'C:\windows\system32\msiexec.exe' -ArgumentList $ArgumentsArray -Wait
    ##TODO Вывод в лог 'Установили версию' $PlatformVersion -ForegroundColor Green
    ##TODO В try/catch завернуть?
}


# Удаляем старые
$InstalledPackages = Get-Package -Name '1*:Предприятие 8*' -ErrorAction SilentlyContinue
foreach ($Package in $InstalledPackages) {
    ##TODO Вывод в лог 'Проверяем версию' $Package.Version
    if ($Package.Version -notin $AllSupportedPlatforms) {
        ##TODO Вывод в лог 'Удаляем версию' $Package.Version
        Uninstall-Package -Name $Package.Name -RequiredVersion $Package.Version -Force
    }
}


Необходимо переделать под свои нужды, обернуть в ScriptBock и вставить в пример выше:
Get-ADComputer -Filter 'Фильтр по вкусу' | ForEach-Object -Process {
    if (Test-NetConnection -ComputerName $PSItem.DnsHostName -InformationLevel Quiet) {
        Write-Host $PSItem.Name 'доступен' -ForegroundColor Green

        # В $ScriptBlock будет установка/проверка наличия/удаление старых версий/etc 1С
        Invoke-Command -ComputerName $PSItem.DNSHostName -ScriptBlock $ScriptBlock
    }
    else {
        Write-Host $PSItem.Name 'НЕдоступен' -ForegroundColor Yellow
    }
}


P.S. - куски кода надерганы из разных скриптов, могут быть ошибки/опечатки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы