Question:
I have the follow code. But there is a {[( )]} missing somewhere. I can’t find it.
I is in the ‘if section. But I dont know why it isnt working
If someone can give a tip or something is it will be create.
Thanks for reading.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
$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() |
Answer:
In PowerShell, all if-statements need braces to enclose their bodies. Below is a demonstration:
1 2 3 4 5 6 7 8 9 10 11 12 |
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 > |
Therefore, the if-statement section of your script should look like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
... 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" } ... |