我有一个简单的 .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
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
答案1
您需要将任务定义为“仅在用户登录时运行”,以便它可以在用户的映射驱动器上工作。应避免使用“无论用户是否登录都运行”选项,以及“以最高权限运行”。
问题是这powershell.exe
是一个控制台程序,因此在执行时会创建一个控制台窗口。使用-WindowStyle Hidden
只会在启动后不久将其隐藏。
解决方案是powershell.exe
首先从隐藏开始。
一种方法是将 PowerShell 命令行隐藏在 WSH 脚本中运行。脚本使用wscript.exe
(不是控制台程序)执行。
示例脚本,例如存储在C:\Scripts\launcher.js
:
var wshShell = new ActiveXObject("WScript.Shell");
wshShell.Run('%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -ExecutionPolicy Bypass -File "C:\\Scripts\\myscript.ps1"', 0, false);
该任务的命令行是:
wscript "C:\Scripts\launcher.js"
这将在没有控制台的情况下运行launcher.js
脚本,然后在隐藏的窗口中运行 PowerShell 命令(因为Run
第二个参数是0
)。
对于发布者来说,另一个可行的解决方案是从 VBScript 启动 PowerShell 脚本: 如何在没有弹出窗口的情况下执行 PowerShell 脚本