好的,所以下面的脚本最初是使用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"
答案 0 :(得分:0)
这绝不是详尽无遗的;只是一些评论。您可能最好将此提交到Code Review StackExchange站点。
一般规则:
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 ......我想现在就行了!
干得好:-)