2017-10-31 21 views
0

私はちょっと答えが見つからないような厄介な問題があります。私はプログラムをアンインストールするためのPowerShellスクリプトと、特定の順序で削除したいプログラムでスクリプトを実行するためのバッチファイルを使用しています。私はウェブ上のスクリプトを発見し、それは私のテストマシン上で完全に動作します。この問題は、別のマシンでスクリプトを実行すると始まります。 これは私が取得エラーです:powershellの入力文字列が正しい形式ではありません

Error formatting a string: Input string was not in a correct format.. 
At C:\Users\currentuser\Desktop\uninstallScript.ps1:60 char:1 
+ &msiexec `/qn `/x `{$stringer`} 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : InvalidOperation: ({{0}}}:String) [], 
RuntimeException 
+ FullyQualifiedErrorId : FormatError 

そしてここでは、PowerShellスクリプトです:

########################################### 
######## Written by DC 2012-02-13######### 
########################################### 
<# 

.SYNOPSIS 

Uninstalls software by only passing the Software Title. 
Should work with all msiexec string uninstallers. 
For uninstall commands that end in uninstall.exe or helper.exe a "/S" is 
used as a switch. 

.PARAMETER DisplayName 

The complete or partial name of the software being uninstalled. Must appear 
as shown in add/remove programs (case insenstive). 


.EXAMPLE 

Uninstall-Program Java 

Will search the registry and uninstall all instances of Java from a machine. 

#> 

[cmdletBinding()] 
Param 
(
[String]$DisplayName = $(throw "DisplayName is Required") 
) 

Set-Variable -Name ThirtyMachine -Value 
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" -Option Constant 
Set-Variable -Name SixtyMachine -Value 
"HKLM:\SOFTWARE\WOW6432NODE\Microsoft\Windows\CurrentVersion\Uninstall" - 
Option Constant 
Set-Variable -Name ThirtyUser -Value 
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" -Option Constant 
Set-Variable -Name SixtyUser -Value 
"HKCU:\SOFTWARE\WOW6432NODE\Microsoft\Windows\CurrentVersion\Uninstall" - 
Option Constant 

$regs = $ThirtyMachine,$SixtyMachine,$ThirtyUser,$SixtyUser 

foreach ($reg in $regs) 
{ 
if(Test-Path $reg) 
{ 
$SubKeys = Get-ItemProperty "$reg\*" 
} 
else 
{ 
$SubKeys = $null 
} 
foreach($key in $SubKeys) 
{ 
if($key.DisplayName -match "$DisplayName") 
{ 

Write-Host "Found Software " $key.DisplayName 
if($key.UninstallString -match "^msiexec") 
{ 
$startGUID = $key.UninstallString.IndexOf("{") + 1 
$endGuid = $key.UninstallString.IndexOf("}") - $startGUID 
$stringer = $key.UninstallString.Substring($startGUID,$endGuid) 
Write-Host "Uninstaller Known, now uninstalling" 
&msiexec `/qn `/x `{$stringer`} 

} 
if($key.UninstallString.Replace('"',"") -match 'uninstall.exe\Z' -or 
$key.UninstallString.replace('"',"") -match 'helper.exe\Z') 
{ 
$stringer = $key.UninstallString.Replace('"',"") 
if(Test-Path $stringer) 
{ 
Write-Host "Possible Uninstaller found. Trying" $key.UninstallString "/S" 
&$stringer /S 
} 
} 
} 
} 
} 

私は、変数$stringerが正しい値を含んでいることを確認するためのPowerShell ISEでコードをデバッグ。だから、これは2台のマシンで動作するPowerShellのバージョンと関係があると私は信じています。スクリプトが動作するテストマシンはバージョン2ですが、エラーが発生したマシンはバージョン4です。パワーサルを習得し始めたので、私はこのマシンで頭を悩ましています。うまくいけば解決するのは簡単です。私は提供された助けを感謝します。

+1

あなたが適切にどのようにここでそれを呼び出すための方法ですか? –

+0

エラーは何がうまくいかないかを明示します。これらの文字の前に墓地のアクセントを入れる理由はありません。 '&msiexec'/qn ''/x '"{$ stringer}" '必要があれば。 – TheIncorrigible1

+0

@ TheIncorrigible1これはトリックを行ったようです。 – daro91

答えて

0

msiexecコールでエスケープ文字 `` `がエラーを引き起こしているため、そこにはいけません。

& msiexec /qn "/x{$stringer}" 

また、あなたがStart-Processを利用して処理を待つことができます:なぜあなたはすべての余分なバッククォート文字を使用している

Start-Process -FilePath 'msiexec' -ArgumentList @('/qn','/x',"{$stringer}") -Wait 
+0

私はその最後の行を将来利用するかもしれません。今、バッチファイルのタイムアウトを使用して、アンインストールの間にある程度の時間を与えています。お手伝いありがとう! – daro91

関連する問題