我当前正在尝试将批处理文件作为启动脚本运行,以检测并删除用户安装的任何版本的Office,然后再安装Office365。但是,当我尝试卸载Office 2013时,安装程序可以正常工作我收到以下错误:
输入错误:找不到脚本文件“ C:\ Windows \ OffScrub_O15msi.vbs”
Offscrub文件与脚本位于同一位置,有人可以告诉我为什么它在C:\ Windows中查找吗?
更新
请找到我当前适用于Office 2013的脚本,我以前在使用Remove2016Installs $true
删除Office 2016时添加了行-Command
,这行得通。由于使用-File
解决了最初的问题,因此我无法获取删除Office 2016的脚本,并希望获得有关如何执行此操作的建议,因此我了解到{{1}之后的任何命令}必须是我认为可能会失败的最后一个。
我的完整脚本如下:
-File
更新完成
有一行调用Powershell脚本start "----NOTICE----" cmd.exe /t:ec /Q /k "echo OFFICE 365 IS BEING INSTALLED. THIS WINDOW WILL CLOSE WHEN COMPLETE&&prompt $h"
@echo off
pushd "%~dp0"
powershell.exe -executionpolicy bypass -NoExit -File "Remove-PreviousOfficeInstalls.ps1"
popd
reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS=32BIT || set OS=64BIT
if %OS%==32BIT "\\domain\SYSVOL\domain\Policies\{Policy Number}\Machine\Scripts\Startup\setup.exe" /configure "\\domain\SYSVOL\domain\Policies\{Policy Number}\Machine\Scripts\Startup\configuration-Office365-x86.xml"
if %OS%==64BIT "\\domain\SYSVOL\domain\Policies\{Policy Number}\Machine\Scripts\Startup\setup.exe" /configure "\\domain\SYSVOL\domain\Policies\{Policy Number}\Machine\Scripts\Startup\configuration-Office365-x64.xml"
taskkill /IM cmd.exe /FI "WINDOWTITLE EQ ----NOTICE----"
taskkill /IM cmd.exe /FI "WINDOWTITLE EQ Administrator: ----NOTICE----"
echo %date% %time% Setup ended with error code %errorlevel%. >> %LogLocation%\%computername%.txt
,这是来自GitHub的文件,对于删除已安装的任何Office版本而言,该文件都很流行。
如果说我将这些文件复制到桌面并修改脚本中的位置,则可以运行此命令,但是我不确定从\ domain \ SYSVOL \ domain \运行时对C:\ Windows的引用是什么策略{策略编号} \ Machine \ Scripts \ Startup \?
答案 0 :(得分:0)
如果您运行PowerShell的默认实例,则它始终在某个目录中启动。这取决于启动方式和启动方式。例如,管理PowerShell通常在C:\ Windows \ System32中启动。如果您使用的路径不是绝对路径,则会相对于该目录应用。
要解决此问题,您需要更改其使用的目录。例如,使用cd
来更改目录。我的猜测是您的脚本Remove-PreviousOfficeInstalls.ps1
包含对VBS的相对调用。
一个简单的解决方法是在运行ps1之前运行脚本块而不是单个命令,而仅运行cd
至\\domain\SYSVOL\domain\Policies\'{Policy Number}'\Machine\Scripts\Startup\
。
您可以通过单击[this]链接或运行powershell -h
来查看PowerShell帮助,其中包含有关使用-Command
开关的以下信息。
...
脚本块必须用大括号({})括起来。您只能在PowerShell中运行PowerShell.exe时指定脚本块。如果要从另一个外壳运行时使用脚本块,则必须使用以下格式:
“&{}”
...
您的用例的另一个重要参数是-File
。
在本地范围(“点源”)中运行指定的脚本,以便该脚本创建的函数和变量在当前会话中可用。输入脚本文件路径和任何参数。
...
您的批次包含以下行:
powershell.exe -executionpolicy bypass -Command "\\domain\SYSVOL\domain\Policies\'{Policy Number}'\Machine\Scripts\Startup\Remove-PreviousOfficeInstalls.ps1 -Remove2016Installs $true"
您要做的是运行一个命令来调用带有参数的脚本。问题在于,该脚本会根据某些功能并通过您的调用来检查其位置是否被错误检测。
有多种方法可以解决此问题。一种是在调用脚本之前更改目录。为此,您需要使用脚本块作为-Command
的参数。例如:
powershell.exe -Command "& {Write-Output 'Hello'; Write-Output 'World';}"
如您所见,有两个独立的Write-Output
命令正在运行。您可以将其更改为cd \\domain\SYSVOL\domain\Policies\'{Policy Number}'\Machine\Scripts\Startup\
并调用脚本。作为奖励,您不再需要将整个路径放在脚本的前面。
另一个选择是在当前调用脚本的情况下运行powershell -File
。这也应该意味着从文件中读取了脚本,并相应地填充了相应的参数。
如果这两个选项都不起作用,则必须检查正在填充的$PSScriptRoot
和/或(Get-Item -Path ".\").FullName
的返回值,因为这两个用于确定目标位置的命令是正在执行的脚本。为此,您可以使用脚本块。
答案 1 :(得分:0)
感谢您的帮助。我的解决方法是使用以下bat命令:
`start "----NOTICE----" cmd.exe /t:ec /Q /k "echo OFFICE 365 IS BEING INSTALLED. THIS WINDOW WILL CLOSE WHEN COMPLETE&&prompt $h"`
@echo off
pushd "%~dp0"
powershell.exe -executionpolicy bypass -File Remove-PreviousOfficeInstalls.ps1 -Remove2016Installs
popd
reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS=32BIT || set OS=64BIT
if %OS%==32BIT "\\Server\Folder\Folder\setup.exe" /configure "\\Server\Folder\Folder\configuration-Office365-x86.xml"
if %OS%==64BIT "\\Server\Folder\Folder\setup.exe" /configure "\\Server\Folder\Folder\configuration-Office365-x64.xml"
taskkill /IM cmd.exe /FI "WINDOWTITLE EQ ----NOTICE----"
taskkill /IM cmd.exe /FI "WINDOWTITLE EQ Administrator: ----NOTICE----"
echo %date% %time% Setup ended with error code %errorlevel%. >> %LogLocation%\%computername%.txt
我必须修改Remove-PreviousOfficeInstalls powershell脚本以包含switch命令:
[Parameter(ValueFromPipelineByPropertyName=$true)]
[switch]$Remove2016Installs = $false,
然后完全按照我的意愿进行操作,它检测到当前版本的Office,将其删除并为该PC \ Laptop安装了正确的Office 365版本。
感谢您的所有帮助