powershell - 撤职
问题描述
我目前正在尝试将批处理文件作为启动脚本运行,以检测和删除用户安装的任何版本的 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\?
解决方案
如果您运行 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
内容,因为这两个命令用于确定正在执行的脚本的位置。为此,您可以使用脚本块。
推荐阅读
- c# - C#中对象名称的连接
- amazon-s3 - Aurora mysql select to s3 完成后挂起
- python - 如何在 matplotlib 中的时间序列上制作 min-max-mean 线图?
- networking - 达到一定配额后,OpenVPN 速度急剧下降
- visual-studio-code - VS Code 搜索中“要包含的文件”的路径相关性是什么?
- javascript - 按多个属性分组对象并合并数组属性
- ios - 在 Flutter for iPhone 中从 UIWebView 转换为 WKwebview
- r - 字符串包含单词的两个字符之间的正则表达式
- python - 使用比较函数查找两个对象列表的交集
- html - 我将如何构建这个?(带有头像和过渡的图片卡)