скрипт ps1, завернутый в vbs, выдает неполные результаты

#powershell #vbscript #gpo

#powershell #vbscript #объект групповой политики

Вопрос:

я создал скрипт .ps1 для мониторинга наших клиентов, и он работает как по маслу. К сожалению, при его выполнении всегда появляется окно powershell, поэтому я включил его в скрипт .vbs, который выполняется с помощью wscript и использует запланированные задачи из объекта групповой политики для ежедневного запуска. И файл ps1, и файл vbs работают, когда я вручную выполняю сценарии, но я не могу заставить его работать в объекте групповой политики. Все работает так, как должно, за исключением подключенных дисков.

вырезан код, который работает при запуске файла .ps1:

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

также работает:

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

сценарий vbs:

 command = "powershell.exe -nologo -ExecutionPolicy Unrestricted -File \networklinktothescript.ps1"
 
set shell = CreateObject("WScript.Shell")
 
shell.Run command,0
  

Ожидаемый результат:

 ,\mappeddrive1
,\mappeddrive2
  

Результат:

 ,
,
  

Я не уверен, связано ли это с разрешением групповой политики или мне следует использовать другой метод. Все работает, как ожидалось, когда я использую не .vbs, а файл ps1 напрямую. Сетевой принтер отображается, как ожидалось.

Комментарии:

1. Где ваш скрипт vbs выдает выходные данные?

Ответ №1:

Первый вопрос: зачем вам нужен скрипт VBScript WSH?

Если цель состоит в том, чтобы получить список подключенных дисков из сценария VBScript, нет необходимости запускать PowerShell и выполнять синтаксический анализ выходных данных. Вместо этого просто используйте WshNetwork объект непосредственно в вашем сценарии WSH. Пример:

 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) amp; " => " amp; Drives.Item(I   1)
  Else
    Output = Output amp; vbNewLine amp; Drives.Item(I) amp; " => " amp; Drives.Item(I   1)
  End If
Next
WScript.Echo Output
  

Но опять же: зачем вам нужен скрипт WSH VBScript?

Комментарии:

1. Часть .ps1 — это лишь небольшой фрагмент сценария powershell, который я запускаю, но это была единственная часть, которая не работала, поэтому я подумал, что остальной код не имеет большого значения. Я завернул скрипт .ps1 в скрипт VBScript, потому что скрипт powershell всегда появлялся на секунду или около того, и я хотел предотвратить это. Тем временем я решил проблему.

Ответ №2:

Я решил свой вопрос, разместив сценарии на клиенте, а не на общем диске.