windows - Detekterer, om en fil er åben i en batchfil

Indlæg af Hanne Mølgaard Plasc

Problem



Sig, at jeg har en batchfil til at udføre en lang byggeri og til sidst skaber den en EXE. Hvis jeg glemmer at lukke appen ned, før jeg starter bygningen, fejler linkfasen, når den ikke kan genskabe EXE.


Jeg vil gerne kontrollere, om EXE'en er åben på start af bygningen. Jeg forsøgte at omdøbe EXE filen til sig selv, men selv om dette giver en adgang nægtet fejl, omdøb kommandoen (som en intern kommando), sætter ikke\% ErrorLevel\%.


Hvad er en ikke-destruktiv måde at kontrollere efter en åben fil, der angiver\% ErrorLevel\% til en værdi uden værdi?

Bedste reference


Omdøbningsmetoden virket ikke for mig (testet på Windows XP SP3). Jeg startede en vilkårlig applikation og forsøgte at omdøbe det til sig selv. Der var ingen fejl, ingen virkning overhovedet.


Denne metode fungerede imidlertid:


COPY /B app.exe+NUL app.exe


Da programmet blev kørt, gav denne kommando mig en fejlmeddelelse. Og da applikationen blev ikke-indbygget, bevarede ikke kun denne kommando indholdet af filen, men det forlod også ændringstidsstemplen uændret.


Hvis jeg var dig, ville jeg derfor sandsynligvis bruge denne kommando (i begyndelsen af ​​batch scriptet, som du sagde) på denne måde:


COPY /B app.exe+NUL app.exe >NUL || (GOTO :EOF)


Operatøren || sender kontrollen til kommandoen/blokken ved siden af ​​den, hvis den foregående kommando er fejlet (hævet fejlniveauet). Derfor vil ovennævnte kommando afbryde scriptet, hvis COPY mislykkedes (som det ville hvis filen var åben).


Fejlmeddelelsen ville blive bevaret (fordi sådanne meddelelser normalt sendes til den såkaldte standardfejlenhed og ikke kasseres med omdirigeringen >NUL, mens andre ikke-fejlmeddelelser typisk sendes til standardudgangen, og det kan også undertrykkes med >NUL) og tjener som en forklaring på den tidlige opsigelse af scriptet. Men hvis du vil vise din egen besked i stedet, kan du prøve noget som dette:


COPY /B app.exe+NUL app.exe >NUL 2>NUL || (ECHO Target file inaccessible& GOTO :EOF)


Mens >NUL gemmer alt, hvad der sendes til standard output, gør 2>NUL det samme for standardfejlen.

Andre referencer 1


Fundet en bedre måde:


:start
timeout /T 5

if exist \%1 (
2>nul (
  >> \%1  (call )
) && (goto ende) || (goto start) ) else ( exit )


:ende
YourCode


Dette vil tjekke hver efter 5 sekunder for 'er filen i brug', hvis den er den, vil den starte igen. hvis ikke, det viser sig at ende, hvor du kan gøre dine næste muligheder

Andre referencer 2


@echo off

:start
ren filename filename        // rename file to same name
if errorlevel 1 goto errorline
echo command successfull file is not in use anymore
goto end
:errorline
echo Rename wasnt possible, file is in use try again in 5seconds
timeout /T 5
goto :start
:end
exit


omdøber fil til samme navn, hvis det er muligt, skifter scriptet til slut, hvem der afslutter koden, otherwize det producerer fejlkode1 og hopper til fejllinje. Efter en timeout på 5 sekunder hopper det til: start og script starter fra begyndelsen.