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"
}