Tem o .cmd na espera de inicialização para que a inicialização do sistema seja executada

3

Em um computador em que não sou de um administrador, há um arquivo de inicialização (arquivo .cmd em C: \ Documents and Settings \ Todos os usuários \ Menu Iniciar \ Programas \ Startup) para todos os usuários. Ele faz várias coisas que eu não gosto, então eu criei meu próprio arquivo .cmd que eu coloquei em C: \ Documents and Settings \ [usuário] \ Menu Iniciar \ Programas \ Startup. / p>

Eu quero que meu código seja executado após em todo o sistema, porque meu programa primeiro desfaz os mapeamentos de rede que o arquivo do sistema fez e o substitui pelos meus próprios mapeamentos de rede. Como posso fazer meu programa esperar e começar assim que o sistema estiver pronto? (Não consigo remover ou editar o arquivo do sistema).

Obrigado

EDIT: O tempo que o arquivo do sistema leva para as execuções varia e eu gostaria que meu arquivo fosse executado logo em seguida. O método "If Exists" parece um pouco contingente, pois o script do sistema pode mudar ou um arquivo pode ser movido. Eu estou esperando para dar o meu script para alguns dos meus colegas de trabalho, esperando que isso funcione sem que eu precise atualizar nada. Além disso, sendo um cara linux, eu não sei o código cmd, então, por favor, escreva quaisquer sugestões de codificação.

    
por Jarvin 04.06.2010 / 00:22

5 respostas

2

O que você está tentando fazer é um pouco difícil se você não tiver acesso ao arquivo .bat de inicialização de "Todos os usuários", se você fez tudo o que precisa fazer é editá-lo para que depois que todos os comandos forem executados você faria

"call Mycoolbatchfile.bat" 

Como isso não é uma opção, minha solução seria codificar o seguinte em 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

Esta é apenas a minha opinião sobre o assunto (um dos muitos).

    
por 07.06.2010 / 16:40
5

Eu usaria o Agendador de Tarefas (Iniciar - > Todos os Programas - > Acessórios - > Ferramentas do Sistema) se você tiver o Windows Vista / Windows 7. Você pode instruir o Windows a executar seu .cmd por um período de tempo especificado após login, como 30 segundos.

    
por 04.06.2010 / 02:30
1

como você mencionou, você quer esperar até os mapeamentos de rede. @Mike Fitzpatrick está correto.

: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

Note que ping -n 2 127.0.0.1 > nul é para esperar algum tempo no Windows.

    
por 07.06.2010 / 16:25
1

Eu percebo que você está procurando uma solução técnica, e há várias ótimas recomendações acima, mas primeiro, você pode querer considerar apenas conversar com seu departamento de TI e ver se eles poderiam ajustar as coisas para não incomodá-lo no primeiro lugar, particularmente se outros colegas de trabalho quiserem que isso mude também. Eu imagino que eles podem não levar de ânimo leve para você desfazer por conta própria as configurações que estão implementando.

Se você decidir avançar com isso, uma possibilidade seria colocar um atalho para ele na pasta de inicialização do menu Iniciar. Os itens nessa pasta não são executados até que o Explorer seja iniciado e, geralmente, o explorer não inicia até que os scripts de inicialização sejam executados.

Outro método seria ter apenas sleep 10 no início do seu arquivo de lote. O comando sleep não está embutido no Windows, mas pode ser baixado como parte do ferramentas de administração do servidor do Windows .

    
por 08.06.2010 / 01:36
1

Faça um if exist em algum arquivo que você sabe que existe na última unidade mapeada que você não deseja mapear, dê um loop (com alguns segundos de pausa) até que ele exista e depois faça o resto do script.

Editar:

IF EXIST funciona bem com apenas uma pasta raiz, para que você possa ver se uma letra de unidade está montada sem ter que se preocupar com um determinado arquivo que está nessa unidade. (Menos contingente)

Eu gosto do uso de ping do @ bubu para introduzir o atraso, mas a sugestão do @ninkle para instalar sleep é mais limpa.

Baseado no código de @ 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
    
por 04.06.2010 / 02:14