2017-08-03 15 views
0

VMを無視している間に、自分の環境内の物理的なワークステーションからVMware Toolsを削除するPowerShellスクリプトを作成しようとしています"#物理的な場合はVMware Toolsの削除を実行し、ログにはのログを書き込んでください"のネストされたif/else文で問題が発生します。 Powershellの経験が豊富な方は、私が間違っている可能性のあることについていくつか指摘できますか?他Powershellのネストされたコマンドレットの名前として認識されない場合

:「他に」は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されていない用語

は、私は、次のエラーメッセージが表示されます。名前の綴りを確認するか、パスが含まれている場合は、パスが正しいことを確認してから を再度試してください。

アマチュアの書式設定についてお詫び申し上げますが、私は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"} 
+3

オープニング 'if'ステートメントがありません(前のステートメントは閉じています)。より標準的な書式を使用してみてください。そうすれば、あなたはすぐに飛び出します。 – briantist

+0

こんにちはbriantist、見ていただきありがとうございます。正直言って私が知っているすべてのことが今のところ自分自身で教えられているので(私は秋にPSでクラスを受講しています)、より標準的なフォーマットがどんなものか分かりません。最初の*と書かれているときは、*が*の場合は2番目の*を意味しますか?物理的な場合はVMware Toolsの削除を実行し、ログ*セクションは書きますか?ありがとうございました。 – DieGeist

答えて

0

私は先に行って、それがクリーンで(あなたが取得しているエラーの原因となった)あなたのブラケットを固定になりますので、あなたのためのいくつかの編集をしました。お気軽に質問してください!将来の参考資料として、スクリプトに何か問題があるかどうかを確認する必要があるときに行う最も簡単な作業は、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" 
} 
+0

私が気付いたことの一つは、$ Env:COMPUTERNAMEのある行です。その行はコンピュータ名を取得していますが、スクリプト内の他の場所では使用していません。その情報をどこかに置く予定がない限り、本当にその行を削除することができます! – cet51

+0

あなたの援助の皆さん、ありがとう。私は今、適切な書式設定のより良い理解を持っています。リストされた答えをいくつか変更して自分の環境で動かせるようにしましたが、コマンドを並べ替えるだけです。私は同じヘルプが必要かもしれない誰かのためにそれを投稿できるかどうかを見てください。 – DieGeist

+0

こんにちはCorey、私が使用している行は* $ ComputerSystemInfo = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $ env:COMPUTERNAME -ErrorAction Stop *です。この場合、* $ env:COMPUTERNAME *は私に*モデル*を提供するシステム情報を取得しています。これは、次の行で使用されます。* switch($ ComputerSystemInfo.Model){*。 – DieGeist

0

これは私が誰かが必要とする場合に使用した最後のスクリプトです。

指導者、時間と知識のためにコリー・エトマンとブライアント教授に感謝します。

#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" 
} 
関連する問題