Dlaczego skrypty .bat są blokowane po uruchomieniu w systemie Windows 7?

3

Od kiedy przeniosłem się do systemu Windows 7, za każdym razem, gdy rozwijam skrypt .bat, mam dokładnie jedną szansę, aby go poprawnie. Jak tylko wykonam skrypt, zostaje on zablokowany przez nieznany proces, nawet jeśli wydaje się, że wykonanie zostało zakończone, i muszę wymusić zamknięcie programu explorer lub zrestartowanie, aby móc ponownie edytować plik .bat.

Na przykład, jeśli utworzę plik .bat,

@echo off
@start prog\ConsolePortable\ConsolePortable.exe

po wykonaniu, uświadom sobie, że muszę zmienić jakiś aspekt skryptu,

@echo off
@cd prog\ConsolePortable
@start ConsolePortable.exe

Wtedy nie będę mógł zapisać moich zmian. Na przykład w gvim pojawia się komunikat „„ console.bat ”jest tylko do odczytu (dodaj! Zastąpić)”, a następnie, gdy próbuję zastąpić, pojawia się komunikat „E212: Nie można otworzyć pliku dla pisanie."

Z pewnością musi istnieć jakiś sposób pisania skryptów bez wymagania ProcessExplorer na każdym komputerze, którego używam. W jaki sposób można znaleźć proces pliku .bat, aby go zatrzymać? Próbowałem ProcessExplorer i BSOD próbowałem to zatrzymać. Próbowałem też użyć cmd / c zamiast startu.

EDYCJA: ConsolePortable zaczyna się tutaj dobrze i wygląda na to, że kończy się dobrze, jednak następująca konfiguracja testowa nie zamraża edytora:

// Program.java
class Program {public static void main(String[] args) {System.exit(0);}}

// startProgram.bat 
echo Starting Program in Java ...
start java Program
echo exiting bat file ...

EDYCJA 2: Być może powinienem wspomnieć, że utworzyłem plik za pomocą polecenia touch w cygwin. Po ponownym uruchomieniu komputera nie mogę powielić tego problemu, chociaż wcześniej napotykałem go na innych komputerach.

Peter Nore
źródło
Czy testujesz plik wsadowy w nowym cmdoknie? Nie jestem do końca pewien, jaka byłaby składnia, ale możesz dodać polecenie na końcu .bat, aby spawnować nowe cmdokno (do następnego uruchomienia) i zabić stare, co powinno zwolnić plik.
jonsca
Nie próbowałem tego; Dwukrotnie go kliknąłem. Spróbuję tego ...
Peter Nore,
3
Patrzę na twój program „ConsolePortable.exe” i upewniam się, że poprawnie się kończy. Zobacz także Dlaczego cmd nie kończy działania po wykonaniu pliku wsadowego?
Mokubai
Gdzie zapisujesz pliki .bat? Jeśli znajduje się w podfolderze plików programu, Win7 domyślnie nie pozwala na edycję. Czasami miałem możliwość dodawania nowych plików, ale nie zapisywania ani edytowania istniejących plików w tych folderach.
BBlake,
@Mokubai Rzuciłem okiem na ten link; misterjaytee zaleca używanie startu jak wyżej. Jak mogę się upewnić, że plik .exe jest poprawnie zamykany? Czy gdzieś jest dziennik błędów?
Peter Nore,

Odpowiedzi:

2

Powiedziałbym, że jest to prawdopodobnie błąd w twoim edytorze lub masz dziwne uprawnienia skonfigurowane.

Dość często edytuję pliki wsadowe za pomocą notatnika (podczas działania) i nie miałem problemu.

Nie jestem jednak pewien, czy można po prostu wstrzykiwać polecenia - zapamiętuje numer linii (tak myślę), który był włączony.

np. w pliku nietoperza, po uruchomieniu zakończy przetwarzanie.

Umieść pauzę w trzeciej linii, a następnie biegnij, ale nie naciskaj żadnego klawisza po pauzie. Edytuj oryginalny plik nietoperza, umieść polecenie w czwartym wierszu - a zobaczysz, że czwarty wiersz zostanie przetworzony.

William Hilsum
źródło
Myślisz, że to problem z waniliowym win32 gvim? Co rozumiesz przez „wstrzykiwanie poleceń ... do pliku nietoperza, po uruchomieniu będzie gotowy do przetwarzania?”
Peter Nore,
1
Wiem, że to jest STARE i nie jest to strona w języku angielskim, ale muszę zaznaczyć, że „będzie” będzie prawdopodobnie oznaczać „będzie” lub „będzie”.
TecBrat
2

Spróbowałbym zmienić linię

@start ConsolePortable.exe

Do

@start "myProgram" ConsolePortable.exe

Od http://ss64.com/nt/start.html :

START „tytuł” ​​[/ Dpath] [opcje] „polecenie” [parametry]

Uwagi:

Zawsze dołączaj TYTUŁ, może to być zwykły ciąg znaków, taki jak „Mój skrypt” lub tylko para pustych cudzysłowów ”„ Zgodnie z dokumentacją Microsoft tytuł jest opcjonalny, ale możesz go mieć problemy, jeśli zostanie pominięty.

Pliki dokumentów można wywoływać poprzez ich skojarzenie, wpisując nazwę pliku jako polecenie. np. START "" WORD.DOC uruchomi aplikację powiązaną z rozszerzeniem .DOC

Ten zaskoczył mnie, gdy jakiś czas temu próbowałem napisać VLC, a umieszczenie tam tytułu naprawiło dla mnie pozornie powiązany problem.

Mokubai
źródło
2
Powinieneś zawsze przekazać tytuł (pusty lub inny) do startpolecenia, chyba że masz absolutną, pozytywną, 100% pewność, że wynikowy wiersz polecenia nie będzie zawierał żadnych cudzysłowów. Jak startwspomina pomoc: zakłada się, że pierwszy cytowany parametr jest tytułem, bez względu na to, gdzie się pojawia.
afrazier 13.06.11