3

На компьютере, на котором я не являюсь администратором, есть файл запуска (файл .cmd в C:\Documents and Settings\All Users\Start Menu\Programs\Startup) для всех пользователей. Он делает несколько вещей, которые мне не нравятся, поэтому я создал свой собственный файл .cmd, который я поместил в C:\Documents and Settings\[user]\Start Menu\Programs\Startup.

Я хочу, чтобы мой код выполнялся после всей системы, потому что моя программа сначала отменяет сопоставления сети, которые выполнял файл всей системы, а затем заменяет ее собственными сопоставлениями сети. Как я могу заставить свою программу ждать и запускаться, как только закончится общесистемная программа? (Я не могу удалить или отредактировать общесистемный файл).

Спасибо

РЕДАКТИРОВАТЬ: Время, которое занимает файл всей системы, зависит от меня, и я хотел бы, чтобы мой файл запускался сразу после. Метод "Если существует" кажется немного условным, поскольку общесистемный скрипт может измениться или файл может быть перемещен. Я надеюсь передать свой сценарий нескольким моим коллегам, поэтому надеюсь, что он будет работать без необходимости что-либо обновлять. Кроме того, будучи парнем из Linux, я не знаю кода cmd, поэтому, пожалуйста, напишите любые предложения по кодированию.

5 ответов5

5

Я бы использовал Планировщик заданий (Пуск -> Все программы -> Стандартные -> Системные инструменты), если у вас Windows Vista / Windows 7. Вы можете указать Windows запускать ваш .cmd указанное количество времени после входа в систему, например, 30 секунд.

2

То, что вы пытаетесь сделать, немного сложно, если у вас нет доступа к файлу .bat для запуска "Все пользователи", если вы сделали все, что вам нужно сделать, это отредактировать его так, чтобы после выполнения всех команд вы могли

"call Mycoolbatchfile.bat" 

Поскольку это не вариант, мое решение будет заключаться в следующем коде в AutoIT

Global $SystemWideScript = "Admin.bat"

Func MountNetworkDrv($drv,$path)
    ShellExecute(@SystemDir & "\net.exe ","use " & $drv & " " & $path,"","",@SW_HIDE)
EndFunc

While 1
    For $i = 1 To 100

        ;Wait for the Batch script to finish executing
If ProcessExists($SystemWideScript) = 0 Then

    ;The system wide "All Users" batch script is not running so we can execute
MsgBox(0,"Custom Network Drives","I Cannot detect " & $SystemWideScript & " running so i'm executing")

MountNetworkDrv("G:","\\192.168.1.2\logs")


MountNetworkDrv("Y:","\\Server\CoolStuff")

Exit
EndIf
Next
Sleep(2000)
Wend

Это только мой взгляд на проблему (один из многих).

1

как вы упомянули, что вы хотите подождать, пока сетевые отображения. @ Майк Фицпатрик прав.

:start
REM check if the filesystem has been mounted
IF EXIST L:\somefile GOTO okay
PING -n 2 127.0.0.1 > nul
goto start
:okay
REM DO EVIL STUFF HERE

Обратите внимание, что ping -n 2 127.0.0.1 > nul для ожидания в Windows некоторое время.

1

Сделайте if exist для какого-то файла, который, как вы знаете, существует, на последнем подключенном диске, который вы не хотите отображать, выполните цикл (с паузой в несколько секунд), пока он не появится, затем выполните оставшуюся часть сценария.

Редактировать:

IF EXIST прекрасно работает только с корневой папкой, так что вы можете видеть, смонтирована ли буква диска, не беспокоясь о том, какой файл находится на этом диске. (Менее условный)

Мне нравится использование ping @ bubu, чтобы ввести задержку, но предложение @ nhinkle об установке sleep чище.

Основано на коде @ bubu:

REM optional initial sleep
sleep 15
:start
REM check if the filesystem has been mounted
IF EXIST L:\ GOTO okay
sleep 5
goto start
:okay
REM DO EVIL STUFF HERE
1

Я понимаю, что вы ищете техническое решение, и есть несколько отличных рекомендаций, приведенных выше, но, во-первых, вы можете подумать о том, чтобы просто поговорить с вашим ИТ-отделом и посмотреть, могут ли они изменить ситуацию, чтобы не раздражать вас в первую очередь, особенно если другие коллеги хотят, чтобы это тоже изменилось. Я полагаю, что они могут не воспринимать легкомысленно, отменяя ваши настройки, которые они применяют.

Однако, если вы все-таки решите продвинуться вперед с этим, одна из возможностей будет заключаться в том, чтобы поместить ярлык к нему в папку запуска меню «Пуск». Элементы в этой папке не запускаются до тех пор, пока не запустится проводник, и, как правило, проводник не запустится, пока не запустятся сценарии запуска.

Другой способ - просто sleep 10 в начале вашего командного файла. Команда sleep не встроена в windows, но может быть загружена как часть инструментов администрирования windows server.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .