我有一个简单的 .ps1 文件来取消映射网络驱动器
# NAS
Set-StrictMode -Version 2.0
If (Test-Path N:) {
Net Use "N:" /delete
}
我有另一个脚本来手动安装该驱动器,我想在任务计划程序中设置一个任务来定期检查驱动器是否已映射,如果是则取消映射。
该脚本有效。
我创建了一个简单的任务,它检查了以下参数:
Run only when user is logged on
Hidden
Arguments: -windowstyle hidden -ExecutionPolicy Bypass C:\Windows\System32\WindowsPowerShell\v1.0\MyScripts\UnmapNAS.ps1
问题是执行时,弹出窗口仍然闪烁 - 尽管非常快。我不希望它闪烁。(例如,当我打字时,它会闪烁并跳过一两个字母。)
我读到解决方案是检查“运行用户是否登录”。我试过了,确实没有更多的弹出窗口。但是,它不起作用,我不知道发生了什么或错误是什么。当我在管理员组中时,我也尝试单击“以最高权限运行”,但它似乎并没有改变任何事情。
我找到了原因,而不是解决方案
我使用以下命令来映射驱动器:
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive("N:", "\\192.168.1.100\NAS", $true, $User, $Password)
该驱动器已安装用于User
. 但是,它不是为NT AUTHORITY/SYSTEM
. 这意味着当任务计划程序运行脚本时,SYSTEM
找不到任何N:
要取消映射的驱动器。
我读到映射驱动器是用户特定的。所以我想解决方案是运行unmapNAS.ps1
as SYSTEM 并编辑该脚本以切换User
到使用该net use /delete
命令。
解决方案
请参阅已接受的答案以获取解释
启动器.vbs:
command = "powershell.exe -ExecutionPolicy Bypass C:\Windows\System32\WindowsPowerShell\v1.0\MyScripts\UnmapNAS.ps1"
set shell = CreateObject("WScript.Shell")
shell.Run command,0
您需要将任务定义为“仅在用户登录时运行”,以便它可以在用户的映射驱动器上工作。应避免选择“无论用户是否登录都运行”,以及“以最高权限运行”。
问题是这
powershell.exe
是一个控制台程序,所以在执行时会创建一个控制台窗口。使用-WindowStyle Hidden
, 只会在它开始后不久将其隐藏。解决方案是从一开始
powershell.exe
就隐藏起来。一种方法是在 WSH 脚本中隐藏运行 PowerShell 命令行。该脚本是使用
wscript.exe
(不是控制台程序)执行的。示例脚本,例如存储在
C:\Scripts\launcher.js
:该任务的命令行是:
这将在
launcher.js
没有控制台的情况下运行脚本,然后在隐藏窗口中运行 PowerShell 命令(因为Run
第二个参数是0
)。适用于海报的替代解决方案是从 VBScript 启动 PowerShell 脚本: 如何在没有弹出窗口的情况下执行 PowerShell 脚本