2015-07-20 3 views
0

Начиная писать Powershell сценарии (очень новый), потому что SCCM стремится лучше реагировать на них (как клиент и сервер) Так с вышеизложенным вот мой первый сценарий:Powershell ForEach петля со встроенным IF заявления

#Changes the 'ProvisioningMode' Key in the registry to False 
$ProvisiongMode = New-ItemProperty -Path Registry::HKLM\SOFTWARE\Microsoft\CCM\CcmExec -Name ProvisioningMode -Value False -Force 
#Clears or 'nulls' the SystemTaskExcludes key in the registry 
$SystemTaskExludes = New-ItemProperty -Path Registry::HKLM\SOFTRWARE\Microsoft\CCM\CcmExec -Name SystemTaskExcludes - Value "" - Force 
#---------------------------------------------------------------------------------------------- 
$Success = "C:\Path\to.log" 
$Failure = "C:\Path\to.log" 
$Computers = Import-Csv "C:\Path\to.csv" 
$SearchStr = Get-ItemProperty -Path Registry::HKLM\SOFTWARE\Microsoft\CCM\CcmExec | select-object ProvisioningMode 
$Online = Test-Conntection -Computername $ComputerName -Count 1 -Quiet 

ForEach ($ComputerName in $Computers) 
if ($Online -eq 'False') 
{ 
    Write-Output $ComputerName`t'Connection Failed' >> $Failure 
} 
Else 
{ 
    if ($SearchStr -eq True) 
    { 
     $ProvisioningMode 
     $SystemTaskExcludes 
    } 

} 

#Second Check 
if ($SearchStr -eq 'False') 
{ 
    Write-Output $ComputerName`t'Registry has been changed' >> $Success 
} 

Этот вопрос относится к переменной $Online. Я хотел бы посмотреть, реагирует ли компьютер на ping, если это правда, затем перейдите к запуску $ProvisioningMode и $SystemTaskExclude. Затем другая проблема запрашивает этот ключ, чтобы проверить, не изменилось ли оно. Проблема с этим одним является $SearchStr = Get-ItemProperty -Path Registry::HKLM\SOFTWARE\Microsoft\CCM\CcmExec | select-object ProvisioningMode возвращается

ProvisionMode 
----------------- 
False 

И я не могу Grab только данные false. Как я уже говорил; очень новый в powershell и пишущий что-то, что я буду использовать, помогает мне учиться.

Edit: Я Пытались это

ForEach ($Name in $Computers) 
{ 
Test-Connection -BufferSize 2 -Computername $Name.ComputerName -Count 1 -Quiet | Write-Output $Online 
} 

if ($Online -eq 'True') {Write-Output $Name`t'Computer is online' >> C:\Online.txt} 

И многие вариации одного и того же.

Test-Connection -BufferSize 2 -Computername $Name.ComputerName -Count 1 -Quiet 

Возвращает данные, который является то, что я хочу, но мне нужно ввести, что в If заявление и по-прежнему сохраняют $Name для $StringStr и лог-файлов.

Те из вас, кто интересуется, вынимает клиент из режима обеспечения при работе с экранным меню. Он исправляет проблему «Нет самоподписанного сертификата».

+0

Прочитать описание «embedded» -tag – Olaf

+0

haha ​​umm предполагалось быть «встроенными, если утверждения». Мой плохой, Олаф. – Benny

ответ

3

Даже если строка представления булевых значений в PowerShell являются True и False, правильный способ сравнения Побейте такое значение с $true и $false переменных.

Кроме того, присвоить результат Test-Connection к $Online с =:

$Online = Test-Connection -BufferSize 2 -Computername $Name.ComputerName -Count 1 -Quiet 

if($Online -eq $true){ 
    # Machine responds to ping, do stuff! 
} 

Но сравнение на самом деле не нужно. Если $Online уже равен $frue или $false, вы можете использовать его на своем собственном внутри если заявления:

if($Online){ 
    # Machine responds to ping, do stuff! 
} 

Я предполагаю, что $ProvisionMode, $SystemTaskExcludes и $SearchStr все заявления, которые вы хотите выполнить на удаленной машине , а не на самом сервере SCCM.

Для этого вам необходимо будет подключиться к аппарату и дать ему команду выполнить инструкции * -ItemProperty.

# Enclosing statements in {} creates a ScriptBlock - a piece of code that can be invoked later! 
$ProvisionMode = { 
    #Changes the 'ProvisioningMode' Key in the registry to False 
    New-ItemProperty -Path Registry::HKLM\SOFTWARE\Microsoft\CCM\CcmExec -Name ProvisioningMode -Value False -Force 
} 

$SystemTaskExludes = { 
    #Clears or 'nulls' the SystemTaskExcludes key in the registry 
    New-ItemProperty -Path Registry::HKLM\SOFTRWARE\Microsoft\CCM\CcmExec -Name SystemTaskExcludes - Value "" - Force 
} 

$SearchStr = { 
    Get-ItemProperty -Path Registry::HKLM\SOFTWARE\Microsoft\CCM\CcmExec | Select-Object -ExpandProperty ProvisioningMode 
} 

#---------------------------------------------------------------------------------------------- 
$LogFilePath = "C:\Path\to.log" 

$Computers = Import-Csv "C:\Path\to.csv" 


foreach($Computer in $Computers){ 

    $Online = Test-Connection -Computername $Computer.Name -Count 1 -Quiet 

    if(-not $Online) 
    { 
     "$ComputerName`t'Connection Failed'" | Out-File -FilePath $LogFilePath -Append 
    } 
    else 
    { 
     $SearchResult = Invoke-Command -ComputerName $Computer.Name -ScriptBlock $SearchStr 
     if ($SearchResult) 
     { 
      # The call operator (&) invokes the scriptblock 
      Invoke-Command -ComputerName $Computer.Name -ScriptBlock $ProvisionMode 
      Invoke-Command -ComputerName $Computer.Name -ScriptBlock $SystemTaskExludes 
     } 
     else # SearchStr must be $false, or non-existing 
     { 
      "$ComputerName`t'Registry has been changed'" | Out-File -FilePath $LogFilePath -Append 
     } 
    } 
} 

Для простоты я использовал Invoke-Command с параметром -ComputerName, но в реальной ситуации в мире, я бы создал PSSession с New-PSSession и повторно использовать, что для связи с Invoke-Command -Session

+0

Итак, блоки скриптов позволяют удаленно выполнять на ПК (и да, НЕ сервер). О, и я вижу, что вы делаете с '$ SearchResult'. Если его true, то запустите блоки, которые ничего не делают (предполагаемый результат - «False»). Потребовал мне минуту на дешифратор, но я это понимаю сейчас. Это намного проще, чем я ожидал. Спасибо, Матиас! Почему вы выбрали Out-File вместо Write-Output? – Benny

+0

Явный вывод подразумевается, и это также, вероятно, не означает, что вы думаете. Он не записывается в файл или переменную, но принимает один или несколько объектов и отправляет их по конвейеру. –

+0

ScriptBlocks - это просто «переносимый код», вы могли бы использовать '& $ ProvisionMode' для его локального вызова, но да, они хорошо подходят для удаленного исполнения –

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