2015-06-03 3 views
0

Я писал несколько командных файлов для некоторых конкретных заданий в качестве поддержки рабочего стола.Запуск .VBS из пакетного файла

Я уже несколько месяцев создаю скрипт резервного копирования профиля, меняя его, как нужно, и по мере возникновения новых проблем.

Я пытаюсь запустить следующий скрипт VBS изнутри своего командного файла и указать его вывод в другую папку.

Set oNet= WScript.CreateObject("WScript.Network") 
Set oDrives = oNet.EnumNetworkDrives 
oUser = oNet.UserName 
Set oFilesys = CreateObject("Scripting.FileSystemObject") 
Set oFiletxt = oFilesys.CreateTextFile("Mapped_Network_Drives_"&oUser&".cmd", True) 
For i = 0 to oDrives.Count - 1 
oFiletxt.WriteLine "Net Use " & oDrives.Item(i) & " " & chr(34)& oDrives.Item(i+1) & chr(34) & " /persistent:yes" 
Next 
oFiletxt.Close 

Этот VBS скрипт был сделан (не мной), чтобы экспортировать пользователя Подключенные сетевые диски в CMD файл, который использует netuse команду переназначить их.

Если сценарий VBS запущен сам за пределами командного файла, то он работает нормально, но когда он запускается внутри пакета с использованием cscript и т. Д., Он создает выходной файл Mapped_Network_Drives_% username% .cmd, но это пустой.

REM pushes script to use batch file Drive Letter as working directory 
setlocal & pushd %~d0 
ECHO ============================= 
ECHO Creating Backup Folder 
ECHO ============================= 
MD "%UserName%_Backup" 
ECHO ============================= 
ECHO Backing Up Mapped Network Drives 
ECHO ============================= 
REM pushes script to use Backup Folder as working directory 
pushd "%~d0%UserName%_Backup" 
REM Runs VB script to backup Mapped Network Drives 
cscript //nologo "%~dp0Mapped_Network_Drives.vbs" 
pause 

Выше приведено из кода, с которым я работал.

+0

работает для меня , Подсказка: не забудьте называть 'popd' (дважды) в конце (чтобы быть последовательным). Также на моей машине, где у меня есть только 1 подключенный сетевой диск, 'oDrives.Count' равен 2 (бросая« Подзаголовок вне диапазона », но, возможно, мой WMI испорчен). Итог, пакетный запуск создает файл '.cmd'. – CristiFati

ответ

0

Попробуйте с этим

VBS часть: Исправленная итерации по коллекции привода

Option Explicit 

Dim userName, drives 
    With WScript.CreateObject("WScript.Network") 
     userName = .UserName 
     Set drives = .EnumNetworkDrives 
    End With 

Dim drive 
    With WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile("Mapped_Network_Drives_" & userName & ".cmd", True) 
     For drive = 0 To (drives.Count-1) Step 2 
      .WriteLine "net use " & drives.Item(drive) & " """ & drives.Item(drive+1) & """ /persistent:yes" 
     Next 
     .Close 
    End With 

партия часть: Обеспечивает все ссылки трактов должным образом обработаны

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    call :getCurrentBatchFile _f0 
    for %%a in ("%_f0%") do (
     set "backupFolder=%%~da\%username%_Backup" 
     set "scriptsFolder=%%~dpa" 
    ) 

    md "%backupFolder%" 2>nul 
    pushd "%backupFolder%" && (
     cscript //nologo "%scriptsFolder%\Mapped_Network_Drives.vbs" 
     popd 
    ) || (
     echo Backup folder does not exist 
    ) 

    goto :eof 

:getCurrentBatchFile returnVar 
    set "%~1=%~f0" 
    goto :eof 
+0

@ScottSmith, вы отправили vbscript с проблемами (главным образом, итерацией по списку дисков), и ответ включает исправленную версию. Вы отправили командный файл с нечеткими ссылками на пути при смене папки и/или дисков, 'pushd"% ~ d0% UserName% _Backup "' терпит неудачу, когда скрипт находится на том же диске, что резервная копия и текущая папка не являются корень диска (и '% 0' ссылки [не всегда возвращаются] (http://stackoverflow.com/a/26851883/2861476), что вы ожидаете), а ответ включает более безопасную версию. Что мне не хватает? –

+0

Вам ничего не хватает и спасибо за помощь. Вы на самом деле объяснили, что вы сделали более подробно выше, что я и искал. Я не понимал, как пакетная часть вписывается в мой текущий скрипт. –

Смежные вопросы