【发布时间】:2018-11-07 19:38:56
【问题描述】:
我在运行 PowerShell 脚本时使用“以不同用户身份运行”,它的行为与我在普通 PowerShell 终端中运行脚本时不同。例如,如果我尝试在“运行方式”终端中运行以下代码,则会遇到错误。但是如果我用普通终端运行它就可以了。
function Replace-Word(
[string]$Document,
[string]$FindText,
[string]$ReplaceText
)
{
$ReplaceAll = 2
$FindContinue = 1
$MatchCase = $False
$MatchWholeWord = $True
$MatchWildcards = $False
$MatchSoundsLike = $False
$MatchAllWordForms = $False
$Forward = $True
$Wrap = $FindContinue
$Format = $False
$Word = New-Object -comobject Word.Application
$Word.Visible = $False
$OpenDoc = $Word.Documents.Open($Document)
$Selection = $Word.Selection
$Selection.Find.Execute(
$FindText,
$MatchCase,
$MatchWholeWord,
$MatchWildcards,
$MatchSoundsLike,
$MatchAllWordForms,
$Forward,
$Wrap,
$Format,
$ReplaceText,
$ReplaceAll
) | Out-Null
$OpenDoc.Close()
$Word.quit()
}
Copy-Item "C:\Welcome.DOC" "C:\test.DOC"
Replace-Word -Document "C:\test.DOC" -FindText '<UserName>' -ReplaceText "JohnDoe"
Replace-Word -Document "C:\test.DOC" -FindText '<EmailAddress>' -ReplaceText "JohnDoe@example.com"
我在以不同用户身份运行时遇到的错误是:
You cannot call a method on a null-valued expression.
At C:\Users\lbradstr\Desktop\TechRepo\NewEEsetup\NewUserSetup.ps1:2668 char:9
+ $Selection.Find.Execute($FindText,$MatchCase,$MatchWholeWord, ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
You cannot call a method on a null-valued expression.
At C:\Users\lbradstr\Desktop\TechRepo\NewEEsetup\NewUserSetup.ps1:2670 char:9
+ $OpenDoc.Close()
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
You cannot call a method on a null-valued expression.
At C:\Users\lbradstr\Desktop\TechRepo\NewEEsetup\NewUserSetup.ps1:2668 char:9
+ $Selection.Find.Execute($FindText,$MatchCase,$MatchWholeWord, ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
You cannot call a method on a null-valued expression.
At C:\Users\lbradstr\Desktop\TechRepo\NewEEsetup\NewUserSetup.ps1:2670 char:9
+ $OpenDoc.Close()
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
两个终端都运行相同版本的 PowerShell:
Major Minor Build Revision
----- ----- ----- --------
5 1 14409 1012
如果可以的话,我会在普通终端中运行此代码,但这只是我正在运行的较大脚本的一部分。脚本的其余部分需要管理权限才能运行,这就是我使用“运行方式”功能的原因。关于为什么代码在两个用户帐户之间执行不同的任何想法?任何建议将不胜感激!
【问题讨论】:
-
错误提示创建
$Word对象本身成功,打开文档$OpenDoc = ...失败。你在传递相对路径吗?两个会话中的工作目录是否相同? -
通常是权限问题。所选帐户是否有权访问该文件? ///// 同样,$Selection = $Word.Selection 是否正确?它看起来应该是 $Selection = $OpenDoc.Selection,但我无法测试它,因为我使用的是 LibreOffice
-
如何在 diff 用户下运行? Runas /noprofile .... 如果是这样,请删除 /noprofile,我认为办公应用程序需要加载配置文件
-
其他账号是否已登录机器并启动了Word?我们确定当您创建 ComObject 时,它不会只是静静地停留在说“欢迎使用 MS Word”的屏幕上,或者正在尝试验证许可证或其他内容吗?尝试将
$Word.Visible = $False更改为$Word.Visible = $True并在其后添加Start-Sleep -Sec 15,以便在其他用户的上下文中运行时查看应用程序的状态。 -
@mklement0 我正在使用指向单独计算机上共享驱动器的绝对路径。我检查并可以从两个配置文件访问该文件。
标签: powershell terminal runas