vbs wrapped ps1 脚本提供了不完整的结果

vbs wrapped ps1 script delivers incomplete results

我创建了一个 .ps1 脚本来监控我们的客户,它非常有效。不幸的是,您在执行它时总是会看到一个 powershell window 弹出,所以我将它包装到一个 .vbs 脚本中,该脚本使用 wscript 执行并每天使用从 GPO 到 运行 的计划任务。当我手动执行脚本时,ps1 文件和 vbs 文件都可以工作,但我无法让它在 GPO 中工作。除映射驱动器外,一切都正常运行。

当我 运行 .ps1 文件时有效的代码片段:

$Network_Drive=(Get-SMBMapping | Select-Object -expand RemotePath) -join "`r`n,"
$Network_Drive | Out-File \a\b\c.csv

也有效:

$Network_Drive= (Get-CimInstance -Class Win32_NetworkConnection | Select -ExpandProperty RemoteName) -join "`r`n,"

vbs 脚本:

command = "powershell.exe -nologo -ExecutionPolicy Unrestricted -File \network\link\to\the\script.ps1"
 
set shell = CreateObject("WScript.Shell")
 
shell.Run command,0

预期结果:

,\mapped\drive1\
,\mapped\drive2\

结果:

,
,

我不确定这是否与组策略有关,或者我是否应该使用其他方法。当我不使用 .vbs 而是直接使用 ps1 文件时,一切都按预期工作。网络打印机按预期显示。

第一个问题是:为什么需要VBScript WSH脚本?

如果目标是从 VBScript 脚本获取映射驱动器列表,则无需 shell PowerShell 并执行输出解析。相反,只需在您的 WSH 脚本中直接使用 WshNetwork 对象。示例:

Dim WshNetwork
Set WshNetwork = CreateObject("WScript.Network")

Dim Output
Output = ""

Dim Drives, I
Set Drives = WshNetwork.EnumNetworkDrives()
For I = 0 To Drives.Count - 1 Step 2
  If Output = "" Then
    Output = Drives.Item(I) & " => " & Drives.Item(I + 1)
  Else
    Output = Output & vbNewLine & Drives.Item(I) & " => " & Drives.Item(I + 1)
  End If
Next
WScript.Echo Output

但再次强调:为什么需要 WSH VBScript 脚本?

我通过将脚本放在客户端而不是共享驱动器上解决了我的问题。