将文件复制到网络的 Powershell 脚本手动运行,而不是从任务计划程序运行

Powershell script to copy file to network runs manually, but not from Task Scheduler

我是 运行 一个脚本,用于将文件从本地位置复制到网络位置。如果我自己通过 powershell 调用脚本而不是从 Task Scheduler 调用脚本,则该脚本有效。我看过 this 和许多其他文章,但我无法让它工作。现在我可以查看任务计划程序,"Last run result",它说任务当前 运行 几分钟后我才停止它。当我结束任务时,我什至没有得到异常(代码在 try/catch)

我将 ServerLocation 和 ServerFullPath 分开了,因为我尝试了几个不同的示例。

代码如下(将domain/username/password替换):

Set-Variable ServerCredentials -option Constant -value "<domain>/<username>  <password>"
Set-Variable ServerLocation -option Constant -value "\<domain>"
Set-Variable ServerFullPath -option Constant -value $ServerLocation"\path\path"

$latest = Get-ChildItem -Path .\ | Sort-Object LastWriteTime -Descending | Select-Object -First 1
net use $ServerFullPath /user:$ServerCredentials

Copy-Item .$latest $ServerFullPath -Force

我是 powershell 的新手,对如何排除故障有什么想法吗?需要更多信息吗?

答案在于 "net use" 的工作原理。在 cmd 中输入 "net use" 显示我已经有一个连接,而且似乎已经有一个连接会让 net use 想要提示,这就是为什么我的脚本似乎挂了。我尝试删除与 "Net use * /delete /y" 的连接,就在原始网络使用之上,这使脚本能够正确继续。它看起来像:

Net use * /delete /y
net use $ServerFullPath /user:$ServerCredentialUser $ServerCredentialPassword

这里的关键是末尾的\y,它会默默地回答是的提示。

顺便说一句 this link 展示了如何使用 /delete 参数。我在这里选择使用 *,但似乎我可以删除该特定连接。

然而,这引发了一些事情,也许网络使用以某种方式提示我关于已经存在的连接,所以我将原始行更改为:

net use $ServerFullPath /user:$ServerCredentialUser $ServerCredentialPassword /y

最后加上 /y 就可以正常工作了,一切都很好:)