Powershell, если команда / else не распознается как имя командлета

Я пытаюсь написать сценарий powershell, который удаляет VMware Tools с физических рабочих станций в моей среде (не спрашивать) при игнорировании виртуальных машин, и у меня возникают проблемы с вложенными операторами if / else в " #Execute VMware Tools, если физические, а затем написать журнал "раздел этого кода. Может ли кто-нибудь с большим опытом работы с Powershell дать мне несколько советов о том, что я, возможно, сделал неправильно?

Я получаю следующую ошибку:

else: термин "else" не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

Я прошу прощения за любительское форматирование, я все еще изучаю Powershell.

Спасибо за любую помощь.

#Create log path
$path = "D:\log\folder\location\"
If(!(test-path $path))
{
New-Item -ItemType Directory -Force -Path $path
}
#Gather required host info
$ComputerSystemInfo = Get-WmiObject -Class Win32_ComputerSystem -
ComputerName $env:COMPUTERNAME -ErrorAction Stop
switch ($ComputerSystemInfo.Model) {
# Check for VMware Machine Type
   "VMware Virtual Platform" {
    $MachineType = "VM"
    }
# Otherwise it is a physical Box
    default {
    $MachineType = "Physical"
    }
    }
#Execute VMware Tools removal if physical, then write log
if($MachineType -eq "Physical") {
   $regpath = "HKLM:\Software\Microsoft\Windows\CurrentVersion\uninstall"
   Get-childItem $regpath | % {$keypath = $_.pschildname 
   $key = Get-Itemproperty $regpath\$keypath}
  if($key.DisplayName -match "VMware Tools") 
   {$VMwareToolsGUID = $keypath} MsiExec.exe /x $VMwareToolsGUID /qn /norestart 
   {Write-output "VMware Tools Uninstalled" | Out-File -Encoding ascii -filepath "D:\log\folder\location\VMware_Uninstalled.txt"}
  else
   {Write-output "VMware Tools Not Present" | Out-File -Encoding ascii -filepath "D:\log\folder\location\VMware_Not_Present.txt"}
   } 
#Write output log if VM
if($MachineType -eq "VM")
 {Write-Output "Machine is virtual" | Out-File -Encoding ascii -filePath 
 "D:\log\folder\location\Virtual_Machine.txt"}
else
 {Write-Output "Error" | Out-File -Encoding ascii -FilePath 
 "D:\log\folder\location\Error.txt"}

2 ответа

Решение

Я сделал несколько изменений для вас, чтобы он выглядел чище и исправил скобки (что и стало причиной ошибки, которую вы получаете). Не стесняйтесь задавать любые вопросы! В качестве справочной информации, которую проще всего сделать, когда вам нужно проверить, что в вашем скрипте что-то не так, вы можете скопировать и вставить его в PowerShell ISE, и он подчеркнет все ошибки, которые он видит красным.

#Create log path
$path = "D:\log\folder\location"

If(!(test-path $path)){
    New-Item -ItemType Directory -Force -Path $path
}

#Gather required host info
$ComputerSystemInfo = Get-WmiObject -Class Win32_ComputerSystem
$Computer = $env:COMPUTERNAME

switch ($ComputerSystemInfo.Model) {
    # Check for VMware Machine Type
    "VMware Virtual Platform" {
    $Global:MachineType = "VM"
    }
    # Otherwise it is a physical Box
    default {
    $Global:MachineType = "Physical"
    }
}

#Execute VMware Tools removal if physical, then write log
if($MachineType -eq "Physical") {
    $regpath = "HKLM:\Software\Microsoft\Windows\CurrentVersion\uninstall"
    Get-childItem $regpath | % {$Global:keypath = $_.pschildname 
    $Global:key = Get-Itemproperty $regpath\$keypath}
}

if($key.DisplayName -match "VMware Tools"){
    $VMwareToolsGUID = $keypath 
    MsiExec.exe /x $VMwareToolsGUID /qn /norestart -wait
    Write-output "VMware Tools Uninstalled" | Out-File -Encoding ascii -filepath 
    "D:\log\folder\location\VMware_Uninstalled.txt"
}else{
    Write-output "VMware Tools Not Present" | Out-File -Encoding ascii -filepath 
    "D:\log\folder\location\VMware_Not_Present.txt"
}

#Write output log if VM
if($MachineType -eq "VM"){
    Write-Output "Machine is virtual" | Out-File -Encoding ascii -filePath 
    "D:\log\folder\location\Virtual_Machine.txt"
}else{
    Write-Output "Error" | Out-File -Encoding ascii -FilePath 
    "D:\log\folder\location\Error.txt"
}

Вот последний сценарий, который я использовал, если он кому-нибудь понадобится.

Спасибо Кори Этмунду и briantist за указатели, время и знания.

#Create log path
$path = "D:\log\folder\location\"

If(!(test-path $path)){
    New-Item -ItemType Directory -Force -Path $path
}

#Gather required host info
$ComputerSystemInfo = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $env:COMPUTERNAME -ErrorAction Stop

switch ($ComputerSystemInfo.Model) {
    # Check for VMware Machine Type
    "VMware Virtual Platform" {
    $Global:MachineType = "VM"
}
    # Otherwise it is a physical Box
    default {
    $Global:MachineType = "Physical"
    }
}

#Write output log if VM
if($MachineType -eq "VM"){
    Write-Output "Machine is virtual" | Out-File -Encoding ascii -filePath "D:\log\folder\location\Virtual_Machine.txt"
    exit
}

#Execute VMware Tools removal if physical, then write log
if($MachineType -eq "Physical") {
    $regpath = "HKLM:\Software\Microsoft\Windows\CurrentVersion\uninstall"
    Get-childItem $regpath | % {$Global:keypath = $_.pschildname 
    $Global:key = Get-Itemproperty $regpath\$keypath}
}

if($key.DisplayName -match "VMware Tools"){
    $VMwareToolsGUID = $keypath 
    MsiExec.exe /x $VMwareToolsGUID /qn /norestart -wait
    Write-output "VMware Tools Uninstalled" | Out-File -Encoding ascii -filepath "D:\log\folder\location\VMware_Uninstalled.txt"
}else{
    Write-output "VMware Tools Not Present" | Out-File -Encoding ascii -filepath "D:\log\folder\location\VMware_Not_Present.txt"
}
Другие вопросы по тегам