2017-01-03 3 views
0

Ich habe eine Datei mit dem Namen - zum Beispiel: 01_XXXXXXXX_XXXX_XXX.txt.Ersetzen Sie Zeichen in Dateiname durch .bat

Ich brauche die ersten drei Zeichen Streifen aus (ersetzen 01_ durch nichts), und ersetzen Sie die restlichen _ durch Spaces.

Ich kann PowerShell nicht verwenden, ich brauche eine einfache .bat Datei, um alle Dateien in dem Verzeichnis, in dem es vorhanden ist, durchlaufen und diese Aufgabe ausführen.

Also das ich verwende:

@echo off 
setlocal enabledelayedexpansion 
for %%a in (*_*) do (
    set file=%%a 
    ren "!file!" "!file:_= !" 
) 

@echo off 
setlocal enabledelayedexpansion 
set X=2 
for %%f in (*) do if %%f neq %~nx0 (
    set "filename=%%~nf" 
    set "filename=!filename:~%X%,-%X%!" 
    ren "%%f" "!filename!%%~xf" 
) 
popd 

Aber es isst zwei Zeichen am Ende vor der Verlängerung und das Hinzufügen eines SPACE am Anfang.

Irgendeine Idee warum?

+3

Yup es ist :) Google-Suche, wie die ersten x Zeichen einer Zeichenkette in Batch trimmen und dann Google-Suche String-Ersatz in Batch :) Für die Schleifenprüfung 'For /?'. – geisterfurz007

+2

Nur nebenbei, warum haben Sie zwei '@echo off' und zwei' setlocal' Anweisungen in derselben Datei und ein 'popd' ohne' 'pushd''? –

Antwort

2

Sie spalten die ersten zwei und die letzten zwei Zeichen ab, da Sie die sub-string expansion syntax falsch implementiert haben. Die führende SPACE leitet sich von der ersten _ vor dem Austausch ab.

Nachfolgend ist eine zuverlässige Art und Weise tun, eine einzige Schleife und sub-string replacement syntax nur verwenden, das erste Mal mit dem * unmittelbar nach dem :, erzählt die Kommandozeileninterpreter, alles zu ersetzen bis zu und einschließlich des ersten Auftretens der Suchbegriff:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 
for %%A in ("*_*") do (
    rem // Store current item: 
    set "FILE=%%~A" 
    rem // Toggle delayed expansion to avoid loss of or trouble with `!`: 
    setlocal EnableDelayedExpansion 
    rem // Remove everything up to and including the first `_`: 
    set "FNEW=!FILE:*_=!" 
    rem // Replace every remaining `_` by ` `: 
    ren "!FILE!" "!FNEW:_= !" 
    endlocal 
) 
endlocal 
exit /B 
1

Wenn Ihr Muster ist konsistent mit 01_XXXXXXXX_XXXX_XXX.txt(dh eine nicht erforderliche Zeichenfolge mit _ von drei erforderlichen Strings getrennt durch _ gefolgt endet), dann ein Einzeiler wie dies genügen:

aus einer Batch-Datei:

@For /F "Tokens=1-4 Delims=_" %%A In ('Where ?*_?*_?*_?*.txt') Do @If Not Exist "%%B %%C %%D" @Ren "%%A_%%B_%%C_%%D" "%%B %%C %%D" 

an der Eingabeaufforderung:

For /F "Tokens=1-4 Delims=_" %A In ('Where ?*_?*_?*_?*.txt') Do @If Not Exist "%B %C %D" @Ren "%A_%B_%C_%D" "%B %C %D" 
Verwandte Themen