2017-06-29 6 views
-1

さて、下のスクリプトはもともとバッチを使用して作成されており、私はPSに変換しました。それは現時点では機能しますが、これを行うにはより良い方法がありますか?特定のプログラムをインストールするPowershellスクリプト。スクリプトは機能しますが、すべてを行うためのよりよい方法はありますか?

まず、オペレーティングシステム32または64ビットがチェックされますので、適切なインストールパスを取得します。それから古いインストールフォルダがあるかどうかをチェックしたい場合は、スクリプトが停止するはずです。 古いインストールフォルダがない場合は、作成したレジストリファイルをインポートします。 その後、ドライブH:をC:\ Tempに変更してから、msiファイルをインストールします。 msiファイルがインストールされると、適切な場所に "program.exe"というインストールパスがあるかどうかをチェックしたいと考えています。 すべてが問題ない場合は、GCTIファイル用のフォルダを作成し、必要なファイルをすべてコピーします。

スクリプトの最後には、さらにいくつかのファイルのコピーが残っています。

このスクリプトは必要なインストールファイルと同じフォルダにあり、このプログラムをインストールするときにこのフォルダをリモートコンピュータにコピーする必要があります。私はこのスクリプトを少し変更して、最初にインストールするコンピュータを尋ねてから、すべてのファイルを特定のリモートコンピュータにコピーし、リモートコンピュータでこのスクリプトを実行するようにします。

#Let's check is OS 32 or 64 bit 
    $bit = "C:\Windows\syswow64\." 
    $isit64bit = Test-Path $bit 
    If ($isit64bit -eq $True) {$installpath = "C:\Program Files (x86)"} 
     Else {$installpath = "C:\Program Files"} 

    #Let's check is there old installation folder 
    $Program = $installpath+"\Program\" 
    $Programtest = Test-Path $Program 


    If ($Programtest -eq $false) {Write-Host "None found, let's continue the installation"} 
Else {Write-Host "Old installation folder found, remove files and try again" Exit} 

    # Create ODBC-connection in registry 
    Start-Process -FilePath Reg -ArgumentList import, ".\Progserver_ODBC.reg" -Wait -WindowStyle Minimized 

    #Let's check if previous action is ok 
    $registry = "HKLM:\SOFTWARE\WOW6432Node\ODBC\ODBC.INI\Progserver\" 
    $registrycheck = Test-Path $registry 
    If ($registrycheck -eq $True) {Write-Host "Registrychange is ok"} 
    Else {Write-Host "Registrychange failed" Exit} 

    # Rename Drive "H:" C:\temp 
    New-PSDrive -Name "H" -PSProvider 'FileSystem' -Root C:\temp 

    # Install the msi 
    Start-Process -FilePath msiexec -ArgumentList /i, "Program-4.3.32.msi", /quiet -Wait 
    $install = "C:\Program Files (x86)\PathtoProgram.exe" 
    $installcheck = Test-Path $install 

    If ($installcheck -eq $True) {Write-Host "Installation succeeded"} 
    Else {Write-Host "Installation failed." Exit} 

    # Create GCTI's 
    $GCTI = "$installpath\PathToGCTI\" 
    If (Test-Path $GCTI) {Write-Host "GCTI folder already exists"} 
    Else {Write-Host "Create GCTI folder"} New-Item -ItemType Directory -Path $GCTI -Force 

    Copy-Item .\PathtoGCTI\* -Destination $GCTI -Recurse -Force 
    Write-Host "Copied GCTI-files" 


    # Copy program.ini ja vec.ini 
    Write-Host "Copying program.ini ja vec.ini" 
    Copy-Item .\PathToProgram.ini $installpath\PathToProgram.ini 
    Copy-Item .\PathToVec.ini $installpath\PathToVec.ini 

    # Change folder rights for the installation folder 
    cacls.exe $installpath\Program /T /E /G "All Users:C" 

    # Copy files from version 4.3.26 
    Copy-Item .\PathToProgram.exe $installpath\PathToProgram -Force 

    # Copy files 
    Copy-Item .\PathToFiles\* $installpath\PathToProgram\ -Force -Recurse 
    Set-ItemProperty $installpath\PathToProgram\graph\* -Name isreadonly $true 

    #Remove PSDrive 
    Remove-PSDrive -Name "H" 

答えて

0

これは決して網羅的ではありません。コメントの選択。あなたはこれをStackExchangeのCode Reviewに送信した方が良いかもしれません。

一般規則:常にPS機能で指定されたパラメータを使用

例えば重要(など/間隔を、タブ移動キャリッジリターン)でフォーマットするあなたのコード

### Don't do this 
Get-ChildItem "C:\temp" 
### Instead do this 
Get-ChildItem -Path "C:\temp" 

テスト我々は64ビットOSを実行し、ファイルパスを結合する場合、適切なProgram Filesフォルダに

if ([environment]::Is64BitOperatingSystem) { 
    $installationPath = $env:ProgramFiles 
} 
else { 
    $installationPath = ${env:ProgramFiles(x86)} 
} 

を選択している場合、Join-Pathを使用します。

### So don't do this 
$Program = $installpath+"\Program\" 
### Instead do this 
$Program = Join-Path -Path $installpath -ChildPath "Program" 

ドライブをマッピングする場合;スコープに注意してください。 そしておそらくあなた自身もまたあなた自身をきれいにすることを確実にしてください!私は過去にこののファウルを下落しているし、防御的プログラミング(ドライブがすでに存在するかどうかを確認し、それがない場合はそれを削除!):-S

try { 
    if (Test-Path -Path "H:\") { 
     Remove-PSDrive -Name "H" 
    } 
    New-PSDrive -Name "H" -Root "C:\temp" -PSProvider FileSystem -Scope Script 
    ### do your other stuff 
catch { 
    throw $_.Exception 
} 
finally { 
    if (Test-Path -Path "H:\") { 
     Remove-PSDrive -Name "H" 
    } 
} 

注意をクリーンアップする悪夢でした。あなたが繰り返し(D.R.Y.)を避けるために、別の関数にマッピングコードを引っ張る可能性がボーナスポイント

ふう...私は、今のところ行いますと思います!

グッドワーク:-)

関連する問題