Powershell脚本安装特定程序。脚本有效但有没有更好的方法来做所有事情?

时间:2017-06-29 06:58:09

标签: powershell installation

好的,所以下面的脚本最初是使用Batch制作的,我把它转换为PS。它目前有效,但有更好的方法吗?

首先我们要检查操作系统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"

1 个答案:

答案 0 :(得分:0)

这绝不是详尽无遗的;只是一些评论。您可能最好将此提交到Code Review StackExchange站点。

一般规则:

  • 始终在PS函数中使用命名参数
  • 您的代码格式 很重要(回车,标签/间距等)

e.g。

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

测试我们是否正在运行64位操作系统并选择相应的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.

Phew ......我想现在就行了!

干得好:-)