В Powershell отсутствует блок инструкций после if

#powershell #syntax-error

#powershell #синтаксическая ошибка

Вопрос:

У меня есть следующий код. Но где-то отсутствует {[( )]} . Я не могу его найти. I находится в разделе «если». Но я не знаю, почему это не работает, если кто-то может дать подсказку или что-то в этом роде, это будет create .

Спасибо за чтение.

 $date        = (get-date).AddDays(-1).ToString("yyyMMdd")
$erroractionpreference = "SilentlyContinue"

$Excel = New-Object -comobject Excel.Application 
$Excel.visible = $True

$ExcelSheet = $Excel.Workbooks.Add() 
$ExcelCell = $ExcelSheet.Worksheets.Item(1)

$ExcelCell.Cells.Item(1,1) = "Machine Name" 
$ExcelCell.Cells.Item(1,2) = "Online" 
$ExcelCell.Cells.Item(1,3) = "Drive" 
$ExcelCell.Cells.Item(1,4) = "Total size (GB)" 
$ExcelCell.Cells.Item(1,5) = "Free Space (GB)" 
$ExcelCell.Cells.Item(1,6) = "Free Space (%)" 
$ExcelCell.cells.item(1,7) = "Used Space (GB)"


$ExcelMakeup = $ExcelCell.UsedRange 
$ExcelMakeup.Interior.ColorIndex = 19 
$ExcelMakeup.Font.ColorIndex = 11 
$ExcelMakeup.Font.Bold = $True 
$ExcelMakeup.EntireColumn.AutoFit()

$intRow = 2

$colComputers = get-content "E:servers.txt"
foreach ($strComputer in $colComputers) 
{ 
$colDisks = get-wmiobject Win32_LogicalDisk -computername $strComputer -Filter "DeviceID ='D:'" 
}

foreach ($objdisk in $colDisks) 
{

if (Test-Connection -ComputerName $strComputer -Count 1 -Quiet) 
    $ExcelCell.Cells.Item($introw, 2) = "Online"

    $ExcelCell.Cells.Item($intRow, 1) = $strComputer.ToUpper() 
    $ExcelCell.Cells.Item($intRow, 3) = $objDisk.DeviceID 
    $ExcelCell.Cells.Item($intRow, 4) = "{0:N0}" -f ($objDisk.Size/1GB) 
    $ExcelCell.Cells.Item($intRow, 5) = "{0:N0}" -f ($objDisk.FreeSpace/1GB) 
    $ExcelCell.Cells.Item($intRow, 6) = "{0:P0}" -f ([double]$objDisk.FreeSpace/[double]$objDisk.Size) 
    $ExcelCell.cells.item($introw, 7) = "{0:N0}" -f ([double]$objDisk.Size/1GB - [double]$objDisk.Freespace/1GB)

 else 

    $ExcelCell.Cells.Item($intRow, 1) = $strComputer.ToUpper() 
    $ExcelCell.Cells.Item($intRow, 2) = "Offline"
    $ExcelCell.Cells.Item($intRow, 3) = "x"
    $ExcelCell.Cells.Item($intRow, 4) = "x"
    $ExcelCell.Cells.Item($intRow, 5) = "x"
    $ExcelCell.Cells.Item($intRow, 6) = "x"
    $ExcelCell.cells.item($introw, 7) = "x"

$intRow = $intRow   1 
}


$ExcelMakeup.EntireColumn.AutoFit() 

$Excel.ActiveWorkbook.SaveAs("E:results"   $date   "_"   (get-date -format "HHmm")   "_D_Drive.xlsx")
$Excel.Workbooks.Close()
$Excel.Quit()
  

Комментарии:

1. Нет фигурных скобок ( {} после if или else )

2. Неважно. Я уже нашел ошибку. Еще раз спасибо!

Ответ №1:

В PowerShell все операторы if нуждаются в фигурных скобках для заключения их тела. Ниже приведена демонстрация:

 PS > if ($true) write 'true'
At line:1 char:10
  if ($true) write 'true'
           ~
Missing statement block after if ( condition ).
      CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
      FullyQualifiedErrorId : MissingStatementBlock

PS > if ($true) { write 'true' }
true
PS >
  

Поэтому раздел if-statement вашего скрипта должен выглядеть следующим образом:

 ...
    if (Test-Connection -ComputerName $strComputer -Count 1 -Quiet)
    {
        $ExcelCell.Cells.Item($introw, 2) = "Online"

        $ExcelCell.Cells.Item($intRow, 1) = $strComputer.ToUpper() 
        $ExcelCell.Cells.Item($intRow, 3) = $objDisk.DeviceID 
        $ExcelCell.Cells.Item($intRow, 4) = "{0:N0}" -f ($objDisk.Size/1GB) 
        $ExcelCell.Cells.Item($intRow, 5) = "{0:N0}" -f ($objDisk.FreeSpace/1GB) 
        $ExcelCell.Cells.Item($intRow, 6) = "{0:P0}" -f ([double]$objDisk.FreeSpace/[double]$objDisk.Size) 
        $ExcelCell.cells.item($introw, 7) = "{0:N0}" -f ([double]$objDisk.Size/1GB - [double]$objDisk.Freespace/1GB)
    }

    else
    {
        $ExcelCell.Cells.Item($intRow, 1) = $strComputer.ToUpper() 
        $ExcelCell.Cells.Item($intRow, 2) = "Offline"
        $ExcelCell.Cells.Item($intRow, 3) = "x"
        $ExcelCell.Cells.Item($intRow, 4) = "x"
        $ExcelCell.Cells.Item($intRow, 5) = "x"
        $ExcelCell.Cells.Item($intRow, 6) = "x"
        $ExcelCell.cells.item($introw, 7) = "x"
    }
...
  

Комментарии:

1. Спасибо за ваш ответ. Но теперь у меня другая проблема со сценарием. Цикл для каждого из них больше не запускается. Я вижу только последний компьютер в моем текстовом файле.

2. Вы выполняете foreach ($objdisk in $colDisks) , но $colDisks будете удерживать только последний компьютер, потому что эта строка $colDisks = get-wmiobject Win32_LogicalDisk -computername $strComputer -Filter "DeviceID ='D:'" продолжает переназначать переменную. Вместо этого вы должны заставить эту строку добавить новый компьютер в массив с именем $colDisks . Это должно решить вашу проблему. Если это не так, я бы рекомендовал задать новый вопрос об этом. Таким образом, вы получите наилучшую помощь.

3. Спасибо за ваш ответ. Я уже исправил проблему. Я снова запускаю сценарий hole, и теперь ошибок нет.

Ответ №2:

Используется только один оператор if. Синтаксис if выглядит следующим образом:

 ***IF (condition returns true) { action }***
  

В основном условие указывается в круглых скобках, а блок выполнения — в фигурных скобках.

Простой пример:

 if (1 -eq 1) { Write-host "1 is equal to 1" }
  

Конечно, в приведенном выше примере условие всегда выполняется. Вы можете использовать любое условие, которое хотите, если оно возвращает логическое значение (true или false).

Внутри вашего скрипта, в

 if (Test-Connection -ComputerName $strComputer -Count 1 -Quiet) 
  

отсутствует фигурная скобка. Вы должны открыть скобку после ‘) ‘ и закрыть перед ‘else’. После этого не забудьте соответствующим образом заключить оператор else в фигурные скобки.

Редактировать:

iCodez уже опубликовал исправленный скрипт. 🙂