vbs包装的ps1脚本无法提供完整的结果

问题描述

我创建了一个.ps1脚本来监视我们的客户,它的工作原理就像一个魅力。不幸的是,执行该命令时始终会弹出一个powershell窗口,因此我将其包装到一个.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脚本中获取已映射驱动器的列表,则无需对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脚本?

,

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