Je veux créer un lot tout en trouvant des lignes spécifiques dans un fichier de commandes et pouvoir modifier ces lignes.
Exemple:
// FICHIER TXT //
ex1
ex2
ex3
ex4
je veux laisser le fichier batch trouver 'ex3' et le modifier en 'ex5' pour qu'il ressemble à ceci:
ex1
ex2
ex5
ex4
Sur une installation native de Windows, vous pouvez utiliser soit batch (cmd.exe) soit vbscript sans avoir besoin d’outils externes. Voici un exemple dans vbscript:
Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file.txt"
Set objFile = objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
If InStr(strLine,"ex3")> 0 Then
strLine = Replace(strLine,"ex3","ex5")
End If
WScript.Echo strLine
Loop
Enregistrez sous myreplace.vbs et sur la ligne de commande:
c:\test> cscript /nologo myreplace.vbs > newfile
c:\test> ren newfile file.txt
Il n'y a pas de fonction de recherche et de remplacement ou d'édition de flux sur la ligne de commande en XP ou 2k3 (je ne sais pas pour Vista ou au-delà). Donc, vous devrez utiliser un script comme celui de Ghostdog publié, ou un outil de recherche et de remplacement comme sed.
Il existe plusieurs façons de le faire, comme le montre ce script:
@echo off
SETLOCAL=ENABLEDELAYEDEXPANSION
rename text.file text.tmp
for /f %%a in (text.tmp) do (
set foo=%%a
if !foo!==ex3 set foo=ex5
echo !foo! >> text.file)
del text.tmp
l'exemple de ghostdog74 a fourni le noyau de ce dont j'avais besoin, car je n'ai jamais écrit aucun vbs auparavant et je devais le faire. Ce n'est pas parfait, mais j'ai étoffé l'exemple dans un script complet au cas où quelqu'un le trouverait utile.
'ReplaceText.vbs
Option Explicit
Const ForAppending = 8
Const TristateFalse = 0 ' the value for ASCII
Const Overwrite = True
Const WindowsFolder = 0
Const SystemFolder = 1
Const TemporaryFolder = 2
Dim FileSystem
Dim Filename, OldText, NewText
Dim OriginalFile, TempFile, Line
Dim TempFilename
If WScript.Arguments.Count = 3 Then
Filename = WScript.Arguments.Item(0)
OldText = WScript.Arguments.Item(1)
NewText = WScript.Arguments.Item(2)
Else
Wscript.Echo "Usage: ReplaceText.vbs <Filename> <OldText> <NewText>"
Wscript.Quit
End If
Set FileSystem = CreateObject("Scripting.FileSystemObject")
Dim tempFolder: tempFolder = FileSystem.GetSpecialFolder(TemporaryFolder)
TempFilename = FileSystem.GetTempName
If FileSystem.FileExists(TempFilename) Then
FileSystem.DeleteFile TempFilename
End If
Set TempFile = FileSystem.CreateTextFile(TempFilename, Overwrite, TristateFalse)
Set OriginalFile = FileSystem.OpenTextFile(Filename)
Do Until OriginalFile.AtEndOfStream
Line = OriginalFile.ReadLine
If InStr(Line, OldText) > 0 Then
Line = Replace(Line, OldText, NewText)
End If
TempFile.WriteLine(Line)
Loop
OriginalFile.Close
TempFile.Close
FileSystem.DeleteFile Filename
FileSystem.MoveFile TempFilename, Filename
Wscript.Quit
Si vous êtes sous Windows, vous pouvez utiliser PET ( [~ # ~] f [~ # ~] ind [~ # ~] a [~ # ~] nd [~ # ~] r [~ # ~] eplace [~ # ~] t [~ # ~] ext). Il ne s'agit que d'un seul fichier * .exe (aucune bibliothèque requise).
Il vous suffit de lancer:
fart.exe your_batch_file.bat ex3 ex5
Vous pouvez toujours utiliser "FAR" = "Rechercher et remplacer". Il est écrit sous Java, donc il fonctionne là où Java fonctionne (à peu près partout). Fonctionne avec les répertoires et sous-répertoires, recherche et remplace dans les fichiers, peut également les renommer. Peut également renommer les fichiers en vrac. Licence = gratuit, pour les particuliers ou les entreprises. Très rapide et maintenu par le développeur. Trouvez-le ici: http://findandreplace.sourceforge.net/
Vous pouvez également utiliser GrepWin. Fonctionne à peu près de la même manière. Vous pouvez le trouver ici: http://tools.tortoisesvn.net/grepWin.html
C'est le genre de choses sed
a été fait pour (bien sûr, vous avez besoin de sed sur votre système pour cela).
sed 's/ex3/ex5/g' input.txt> output.txt
Vous aurez besoin d'un système Unix ou d'une plate-forme Windows Cygwin pour cela.
Il y a aussi GnuWin32 pour sed . ( installation et utilisation de GnuWin32 ).
@echo off
set "replace=something"
set "replaced=different"
set "source=Source.txt"
set "target=Target.txt"
setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
)
) > %target%
endlocal
Source . En espérant que cela aidera quelqu'un.
Vous pouvez faire comme ça:
rename %CURR_DIR%\ftp\mywish1.txt text.txt
for /f %%a in (%CURR_DIR%\ftp\text.txt) do (
if "%%a" EQU "ex3" (
echo ex5 >> %CURR_DIR%\ftp\mywish1.txt
) else (
echo %%a >> %CURR_DIR%\ftp\mywish1.txt
)
)
del %CURR_DIR%\ftp\text.txt