Показать полную графическую версию : [архив] Нужна помощь в написании BAT | CMD | VBS | WSH файлов
а в самом cmd, если это возможно. »
в начале
if [%RUNNED%]==[1] goto :Eof
set RUNNED=1
..........
код батника
..........
rem в саммом конце основного блока.
set Runned=
goto :eof
RUNNED не должно использоваться в оригинальном cmd. В противном случае изменить на другое имя
Liveofan
13-11-2008, 10:42
amel27,
Ясн. может пригодится, токо начал читать про WSH интересно )
Сейчас хочу автоматизовать процесс ввода в домен, на микрософте наткнулся на вот этот скриптик:
Const JOIN_DOMAIN = 1
Const ACCT_CREATE = 2
Const ACCT_DELETE = 4
Const WIN9X_UPGRADE = 16
Const DOMAIN_JOIN_IF_JOINED = 32
Const JOIN_UNSECURE = 64
Const MACHINE_PASSWORD_PASSED = 128
Const DEFERRED_SPN_SET = 256
Const INSTALL_INVOCATION = 262144
strDomain = "domen"
strPassword = "123"
strUser = "user"
Set objNetwork = CreateObject("WScript.Network")
strComputer = objNetwork.ComputerName
Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & _
strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & _
strComputer & "'")
ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, _
strPassword, strDomain & "\" & strUser, NULL, _
JOIN_DOMAIN + ACCT_CREATE)
Протестил, с задаными параметрами, человек запуская его, может добавить машину в домен, но только если изначально зайдет и введет имя машины ручками, все отлично работает.
Но хотелось бы еще в скриптик добавить обработчик ошибки. Т.е. если скрипт сработал и комп в домен попал, чтобы выскочила надпись, комп успешно добавлен в домен, если же комп не смог войти в домен, то выскочило окно ошибки.
И еще вопрос, возможно ли с помощью WSH заполнять сетевые настройки, а также имя компьютера?
Это чисто скриптовый язык? Т.е. графические элементы у него есть? Например когда нужно ввести имя компьютера, то вписывать его не в тело скрипта, а чтобы выскочила панель, куда ты добавишь имя и нажмешь, ок )
Liveofan
13-11-2008, 11:11
А еще такой вопрос, есть ли отладчик приложений для WSH, а то если ошибка в коде есть, он просто мне выбрасывает виндовскую табличку с номером строки, в которой ошибка и все (
Rostlv
Нужна cmd-команда, не позволяющая запустить одновременно 2 и более cmd-файлов, причём её нужно указать не в exe-файле, а в самом cmd »
вариант, предложенный vserd не подойдет - в каждой сессии свои переменные окружения,
вместо SET можно использовать SETX (http://www.microsoft.com/downloads/details.aspx?FamilyID=dc2d3339-8f36-4fba-a406-2a2a2ad7208c&DisplayLang=en) из ресурскита Win2K:
IF "%RUNNED%"=="1" EXIT
SETX RUNNED 1
:: ---
PAUSE
:: ---
SETX RUNNED 0
или через реестр - не так красиво, зато штатными средствами:
REG QUERY HKCU\Environment /v RUNNED
If "%ERRORLEVEL%"=="0" EXIT
REG ADD HKCU\Environment /v RUNNED /d 1 /f
:: --
PAUSE
:: --
REG DELETE HKCU\Environment /v RUNNED /f
ADD: или через временный файл:
IF EXIST "%~dpn0.run" EXIT
@Echo.>"%~dpn0.run"
:: --
PAUSE
:: --
DEL "%~dpn0.run"
Liveofan
есть ли отладчик приложений для WSH »
Script Debugger for Windows NT 4.0 and Later (http://www.microsoft.com/downloads/details.aspx?familyid=2F465BE0-94FD-4569-B3C4-DFFDF19CCD99&displaylang=en)
официально больше не поддерживается, хотя работает (смотреть внизу "Additional Information")
если ошибка в коде есть, он просто мне выбрасывает виндовскую табличку с номером строки, в которой ошибка и все ( »отлавливать ошибки с помощью объекта "Err", указав "On Error Resume Next", подробно и с примерами:
Doctor Scripto's Script Shop (To Err Is VBScript – Part 1) (http://www.microsoft.com/technet/scriptcenter/resources/scriptshop/shop1205.mspx)
Doctor Scripto's Script Shop (To Err Is VBScript – Part 2) (http://www.microsoft.com/technet/scriptcenter/resources/scriptshop/shop0106.mspx)
И ещё вопрос, как с помощью cmd-файла проверить наличие определённого файла в системе, вернее его версии и при не совпадении версии файла с заданной, запретить выполнение cmd.
Babullika
13-11-2008, 15:38
Всем доброго времени суток.
Прошу помочь с батником.
Подключаюсь к инету таким вот образом :
@echo off
rasdial "internet 1" "login" "pass"
if errorlevel 1 goto error
echo.
echo Программа завершила свою работу!
goto end
:error
echo.
echo Произошла ошибка при работе программы
sleep.exe 3
rasdial "internet 2" "login" "pass"
if errorlevel 1 goto error
echo.
echo Программа завершила свою работу!
goto end
:error
echo.
echo Произошла ошибка при работе программы
sleep.exe 3
rasdial "internet 3" "login" "pass"
if errorlevel 1 goto error
echo.
echo Программа завершила свою работу!
goto end
:error
echo.
echo Произошла ошибка при работе программы
:end
Подскажите как реализовать такую схему: если internet 1 выдал ошибку а инет 2 подключился то поменять их местами , а если второй тоже выдал ошибку а третий сработал то третий на место первого , сдвинув первый на место второго а второй на место третьего ...
( чтобы в следущий раз при запуске бат файла подключалось первым к тому который последний раз был успешно подключен )
Заранее спасибо
Petya V4sechkin
13-11-2008, 15:58
как с помощью cmd-файла проверить наличие определённого файла в системе, вернее его версии
[решено] как узнать “версию файла”? (http://forum.oszone.net/thread-100380.html)
и при не совпадении версии файла с заданной, запретить выполнение cmd
Примерно так:
@Echo Off
For /F "Tokens=5 Delims= " %%I In ('Filever.exe %windir%\explorer.exe') Do Set V=%%I
Echo %V%
If %V% NEQ 6.0.2900.5512 (
Echo Версия Explorer.exe не равна 6.0.2900.5512
Pause
Exit
)
Babullika
как реализовать такую схему: если internet 1 выдал ошибку а инет 2 подключился то поменять их местами , а если второй тоже выдал ошибку а третий сработал то третий на место первого , сдвинув первый на место второго а второй на место третьего »хранить порядок в файле, примерно так:
@Echo OFF
Set CONN_LIST=%~dpn0.ini
Set TEMP_LIST=%~dpn0.tmp
If Exist "%TEMP_LIST%" Del /Q "%TEMP_LIST%"
For /F "UseBackQ Delims=" %%i In ("%CONN_LIST%") Do Call :CONNECT %%i
If Defined CONN_PARM (
Echo %CONN_PARM%>"%CONN_LIST%"
Type "%TEMP_LIST%">>"%CONN_LIST%"
Echo.
Echo Подключение произведено успешно!
) Else (
Echo.
Echo Произошла ошибка при работе программы
)
Exit
:CONNECT
If Defined CONN_PARM GOTO :CONNECT_SKIP
>Nul RasDial %*
If NOT ERRORLEVEL 1 Set CONN_PARM=%*
If Defined CONN_PARM GoTo :EOF
:CONNECT_SKIP
Echo %*>>"%TEMP_LIST%"
GoTo :EOF
примерное содержимое файла "Имя батника".INI:
"Internet 1" "Login1" "Pass1"
"Internet 2" "Login2" "Pass2"
"Internet 3" "Login3" "Pass3"
"Internet 4" "Login4" "Pass4"
"Internet 5" "Login5" "Pass5"
вариант, предложенный vserd не подойдет - в каждой сессии свои переменные окружения, »
Вообще-то да :((( я как-то не учел что запуск из под внешнего приложения. Для разных сесий нужно создавать и удалять файл.
Babullika
14-11-2008, 14:16
amel27
спасибо !
еще вопрос - при подключении между повторами необходимо реализовать задержку через sleep.exe , т.е. если подлючение несработало перед попыткой сделать второе надо вставить sleep.exe 10 , неподскажете куда его вставить в вашем коде ?
Если выделить несколько файлов и один из них переименовать допустим на: oszone, то все последующие (как они выстроены в текущем положении, сверху вниз) будут называться oszone (1), oszone (2) и.т.д
а как сделать так, чтобы чередование шло не в скобках, а просто цифрами? (oszone 1, oszone2 и.т.д)
Babullika
куда его вставить »
можно сразу перед или после строки дозвона ">Nul RasDial %*"
ADD: все-таки "перед", иначе собьется значение ERRORLEVEL
Доброго всем времени уток.
Вопрос такой по CMD. Есть расшаренный текстовый файл ZZZ.csv.
@echo off
title Scanning ZZZ.csv if it is not locked . . . . .
:rescan
q:\XX\YY\ZZZ.csv 2>nul || goto rescan
exit Ну или, скажем, вместо "||" сделать то же if not "%errorlevel%" == "0"
Может и глупый, но вопрос: почему оно не выполняет EXIT в случае успешного нахождения и открытия освободившегося файла?
Если файл освобождается юзером, то он нормально открывается в Эхеле, но окно скрипта при этом продолжает висеть пока не закроешь либо его само, либо этот CSV.
И ещё в ту же тему интересный вопрос: скажем, у меня .CSV ассоциировано на открытие Excel'ем. Если этот файл уже кто-то открыл и я пытаюсь открыть его через консоль, то пишет ошибку, что его уже использует другой процесс, если через Explorer, то рисует экселевскую табличку, говоря, что файл уже открыт "by 'ANOTHER USER'". Если бы это был обычный XLS или DOC, в таком случае МС Офис пишет, что файл уже открыт таким-то, обозначая конкретное имя пользователя. Очень важный вопрос возник, можно ли как-нибудь определить, кто именно открыл этот расшаренный файл, кто скрывается под обозначением "another user"?
Petya V4sechkin
17-11-2008, 20:11
Если файл освобождается юзером, то он нормально открывается в Эхеле, но окно скрипта при этом продолжает висеть пока не закроешь либо его само, либо этот CSV.
Команду start добавьте:
start q:\XX\YY\ZZZ.csv 2>nul || goto rescan
Gennie
можно ли как-нибудь определить, кто именно открыл этот расшаренный файл, кто скрывается под обозначением "another user"? »
для файлов, открытых по сети можно использовать PsFile (http://technet.microsoft.com/en-us/sysinternals/bb897552.aspx)
для локально открытых файлов - Handle (http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx) + TaskList
amel27, ...
Unable to connect to myserver01. Verify user name and password.
Error listing remotely open files on myserver01:
Access is denied. При этом на сам сервер заходит нормально (смапленный сетевой диск), хоть через "\\", хоть по названию смапленного диска. А удалённо, видать, не пущает.
Кстати, вот, добавляю картиночку, что иногда возникает при введении команды start. То есть, получается, иногда (не всегда, а почему-то только иногда) скрипт работает не открывая сам файл CSV _только_ если он освободился от другого пользователя, а как будто я его пытаюсь запустить из GUI, вне зависимости, занят он или нет. Причём задача-то скрипта как раз и состояла в том, чтобы не пытаться открыть файл, если его уже кто-то занял, но сканировать его до тех пор, пока не отпустят, и только тогда запускать. Пока в голову приходит только одно объяснение: что этот файл был открыт сразу несколькими пользователями с уведомлением о его закрытии, и как только RW-юзер его отпускает, тут же Эксель передаёт RW-права следующему пользователю, а мой скрипт в это время почему-то не успевает перехватить открытие файла. Подскажите, плз, так ли это.
Bullet-Avalon
19-11-2008, 09:17
Помогите с написанием БАТ файла...если это возможно конечно....
Вот что именно, надо
В конторе необходимо чтобы при запуске бат файла он раскидывал файл(это обновление антивируса, который лежит на моем компе), по папкам на юзерские машины по сети(у всех юзеров эта папка называется ОБМЕН).... вот в принципе и вссе, ато так каждому кидать этот файл, тяжеловато....Тока не спрашивайте зачем так все сложно, все вопросы к моему главному сис админу))))
Bullet-Avalon, примерно так:@Echo Off
:: Файл списка хостов
Set $LST=%~dpn0.lst
:: Источник /приемник
Set $SRC=C:\ОБМЕН\*
Set $DST=C$\ОБМЕН\
For /F "UseBackQ Delims=" %%i In ("%$LST%") Do Call :COPYPROC %%i
Exit
:COPYPROC
:: ------
@Echo Проверка соединения с "%1"...
>Nul PING -n 1 %1
If ErrorLevel 1 GoTo :EOF
@Echo Копирование файлов на "%1"...
XCopy "%$SRC%" "\\%1\%$DST%" /S /V /K /Y /Z /R /H /Q
GoTo :EOF
З.Ы. как видно из батника, список компов - в одноименном файле с расширением LST
Ребят подскажите пожалуйста как написать батник что бы он удалял файлы и папки из определённой папки?
Я пишу так: Rmdir "C:\documents and Settings\****\local settings\temp\"/q /s
Так с этой командой удаляется сама папка temp а мне надо что бы из неё (из папки Temp) удалялись все папки и файлы...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.