#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 уже опубликовал исправленный скрипт. 🙂