Si vous voulez faire tout dans un fichier batch (comme demandé), j'utilise cette technique.
Vous pouvez lire des données à l'intérieur d'un fichier batch (et les utiliser dans le même fichier batch) en utilisant l'option " pour /f commande ".
Par exemple, nous lirons simplement le texte du message au bas du fichier batch et l'afficherons dans la fenêtre de commande :
@echo off
@for /f "tokens=1,* eol=@ delims= " %%i in (%~0) do @echo %%j
@pause
@rem YOUR MESSAGE HERE:
rem Now is the winter of our discontent
rem Made glorious summer by this sun of York;
rem And all the clouds that lour'd upon our house
rem In the deep bosom of the ocean buried.
La ligne :
@for /f "tokens=1,* eol=@ delims= " %%i in (%~0) do @echo %%j
fait le gros du travail en jouant avec le caractère de fin de ligne ( @ ) et en utilisant les espaces après les " rem "comme délimitation. Je l'ai appelé "DUYOA.bat", ou "Dissappearing Up Your Own...".
Nous pouvons maintenant étendre le même principe de sorte que le fichier batch crée un script VBS, qui à son tour lit le fichier batch pour créer un fichier batch esclave.
Le fichier batch esclave est dérivé de la partie supérieure du fichier batch d'origine, quel que soit l'endroit où " @rem "est le préfixe.
Toujours avec moi ? Ne vous inquiétez pas, nous y sommes presque...
Le script VBS est alors lancé par le fichier batch d'origine et exécute le fichier batch esclave en arrière-plan :
@echo off
rem ' ###########################################
rem ' THIS BATCH FILE READS ITSELF, AND CREATES A
rem ' VBS SCRIPT TO RUN ITSELF IN THE BACKGROUND
rem ' ###########################################
rem ' NOTE: Prefix your original batch commands with "@rem ":
@rem rem Log the starting of the batch file
@rem echo %date% %time% - %random% Started >> %USERPROFILE%\Desktop\Log.txt
@rem D:\ffmpeg\ffplay -autoexit -nodisp "D:\mp3\Incoming.mp3"
@rem D:\ffmpeg\ffplay -autoexit -nodisp "D:\mp3\Incorrect.mp3"
@rem D:\ffmpeg\ffplay -autoexit -nodisp "D:\mp3\Boing.mp3"
@rem rem Don't play the tada sound
@rem rem D:\ffmpeg\ffplay -autoexit -nodisp "C:\Windows\Media\tada.wav"
@rem rem Log the completion of the batch file
@rem echo %date% %time% - %random% Completed >> %USERPROFILE%\Desktop\Log.txt
rem ' ##########################################################
rem ' THE REST OF THIS SCRIPT STAYS THE SAME, EVEN IF THIS BATCH
rem ' FILENAME CHANGES. IT AND CAN BE PASTED INTO ANY BATCH FILE
rem ' WHOSE COMMANDS ARE PREFIXED WITH "@rem "
rem ' ##########################################################
rem ' Any line prefixed with "@" is actioned by this master batch file:
rem ' -----------------------------------------------------------------
@set random=%temp%\%~n0%~x0-%random%.vbs
@echo MasterBatchFileName = "%~n0%~x0" > %random%
@for /f "tokens=1,* eol=@ delims= " %%i in (%~0) do @echo %%j >> %random%
@start %random%
rem ' Any line prefixed with "rem " will be written to the VBS script:
rem ' ----------------------------------------------------------------
rem On error resume next
rem Set fso = CreateObject("Scripting.fileSystemObject")
rem SlaveBatchFileName = fso.GetSpecialFolder(2) & "\" & fso.GetTempName & ".bat"
rem Set aFile = fso.CreateTextFile(SlaveBatchFileName, TRUE)
rem Const OPEN_FILE_FOR_READING = 1
rem Set objInputFile = fso.OpenTextFile(MasterBatchFileName, 1)
rem inputData = Split(objInputFile.ReadAll, vbNewline)
rem For each strData In inputData
rem if left(strData,5)="@rem " then
rem aFile.WriteLine(replace(strData,"@rem ",""))
rem end if
rem Next
rem aFile.Close
rem objInputFile.Close
rem CreateObject("Wscript.Shell").Run SlaveBatchFileName, 0, True
rem Set aFile = fso.GetFile(SlaveBatchFileName)
rem aFile.Delete
rem Set aFile = fso.GetFile(WScript.ScriptFullName)
rem aFile.Delete
Si vous avez mal à la tête à force d'essayer de comprendre, utilisez la moitié inférieure de la page :
rem ' THE REST OF THIS SCRIPT STAYS THE SAME...
vers le bas en tant que sous-programme à coller dans vos fichiers batch, et préfixez toutes les commandes originales par "@rem ".
Je place tous les fichiers enfants dans le répertoire temporaire, et le VBS script les supprime (ainsi que lui-même) à la sortie.
Vous pouvez supprimer l'enregistrement et tous les commentaires pour résumer la situation, et/ou aller dans l'autre sens et ajouter une fenêtre contextuelle de 3 secondes au bas du fichier, à la toute dernière ligne :
rem wscript.CreateObject("wscript.Shell").Popup MasterBatchFileName & " completed!",3,MasterBatchFileName,4096+64
Je sais que cela ne résout pas le problème du flash de la fenêtre de commande, mais cela exécute le fichier batch en arrière-plan, et vous n'avez pas besoin d'un script VBS séparé qui traîne comme dans les autres réponses.