首页 > 解决方案 > 撤职

问题描述

我目前正在尝试将批处理文件作为启动脚本运行,以检测和删除用户安装的任何版本的 Office,然后安装 Office 365。但是,当我尝试卸载 Office 2013 时,我收到了以下错误:

输入错误:找不到脚本文件“C:\Windows\OffScrub_O15msi.vbs”

Offscrub 文件与脚本位于同一位置,有人能告诉我为什么它在 C:\Windows 中查找吗?

更新

请找到我现在适用于 Office 2013 的当前脚本,我之前在用于删除 Office 2016Remove2016Installs $true时添加了该行,这行得通。-Command自从-File用来解决我最初的问题以来,我一直无法获得删除 Office 2016 的脚本,并且想要一些关于如何做到这一点的建议,我已经读到,-File我认为之后的任何命令都需要是最后一个命令可能是它失败的原因。

我的完整脚本如下:

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

更新完成

有一行调用 Powershell 脚本Remove-PreviousOfficeInstalls,这是来自 GitHub 的一个文件,对于删除您安装的任何 Office 版本非常流行。

如果说我将这些文件复制到桌面并修改脚本中的位置,我可以运行此命令,但我不确定从 \domain\SYSVOL\domain\Policies{Policy 运行时对 C:\Windows 的引用是什么Number}\Machine\Scripts\Startup\?

标签: powershellbatch-fileoffice365gpo

解决方案


如果您运行 PowerShell 的默认实例,它总是在某个目录中启动。这取决于它是如何以及由谁开始的。例如,管理 PowerShell 通常在 C:\Windows\System32 中启动。如果您使用任何非绝对路径,它们将相对于该目录应用。

要解决此问题,您需要更改它使用的目录。例如通过使用cd来更改目录。我的猜测是您的脚本Remove-PreviousOfficeInstalls.ps1包含对 VBS 的相对调用。

一个简单的解决方法是在运行 ps1 之前运行cd脚本块而不是单个命令。\\domain\SYSVOL\domain\Policies\'{Policy Number}'\Machine\Scripts\Startup\

您可以通过以下 [this] 链接查看或运行 PowerShell 帮助,其中包含有关使用开关powershell -h的以下信息。-Command

...

脚本块必须用大括号 ({}) 括起来。只有在 PowerShell 中运行 PowerShell.exe 时才能指定脚本块。如果要在从另一个 shell 运行时使用脚本块,则必须使用以下格式:

“&{}”

...

您的用例的另一个重要参数是-File.

在本地范围内运行指定的脚本(“dot-sourced”),以便脚本创建的函数和变量在当前会话中可用。输入脚本文件路径和任何参数。

...

您的批次包含以下行:

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命令正在运行。您可以将其更改为 acd \\domain\SYSVOL\domain\Policies\'{Policy Number}'\Machine\Scripts\Startup\并调用您的脚本。作为奖励,您不再需要将整个路径放在脚本前面。

另一种选择是powershell -File使用您当前的脚本调用运行。这也应该意味着从文件中读取脚本并相应地填充相应的参数。

如果这些选项都不起作用,您将不得不检查$PSScriptRoot正在填充的内容和/或返回的(Get-Item -Path ".\").FullName内容,因为这两个命令用于确定正在执行的脚本的位置。为此,您可以使用脚本块。


推荐阅读