2017-12-13 3 views
2

Ich benutze Windows 10 Pro mit Batch-Dateien (offen für die Verwendung von VBS und PS1-Dateien) und ich habe eine Textdatei automatisch von Software exportiert, die aussehen kann dies:Batch Trim Linien in Textdatei nach Sub-String - REM Trim mit Erweiterung

Sub_Group691_FE7IP11_2017-12-12.sldasm_bin/parts/Loft-Project.sldasm_bin/parts/Loft-Project... 
Sub_Group691_FE7IP12_2017-12-12.sldasm_bin/parts/Loft-Project.sldasm_bin/parts/Loft-Project... 
Sub_Group691_FE7IP13_2017-12-12.sldasm_bin/parts/Loft-Project.sldasm_bin/parts/Loft-Project... 

Jede Zeile setzt sich nach den Unterteilen Angabe „...“ und enthalten ‚Gift‘ Zeichen könnte. Der Sub_Group-Teil wird aus dem Dateinamen gezogen und kann auch "Gift" -Zeichen enthalten.

Was ich zu tun suche ist, exportieren Sie nur den Dateinamen, der direkt am Anfang jeder Zeile ist, bis zu und einschließlich der ersten Dateierweiterung, in diesem Fall ".sldasm." Alles auf der rechten Seite der ersten Instanz von .sldasm sollte getrimmt werden.

Was ich bisher gemeinsam auf Stackoverflow aus der Forschung gepflasterten habe, ist:

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "inputfile=C:\Scratch\ASMExport.txt" 
SET "outputfile=C:\Scratch\InputFiles.txt" 
(
FOR /f "usebackqdelims=" %%a IN ("%inputfile%") DO (
    SET "currentline=%%a" 
    ECHO("!currentline:.sldasm=.sldasm & rem "!" 
) 
)>"%outputfile%" 

GOTO :EOF 

Mein Problem mit der „rem“ Linie liegt, die scheint nicht wie beabsichtigt zu funktionieren, weil die FOR-Schleife innerhalb eines Wesens oder weil eine verzögerte Erweiterung aktiviert werden muss. Es scheint, den "& rem" als Text zu analysieren, der dafür zu sein scheint, weil die verzögerte Expansion funktioniert. Was ich aus den obigen Zeilen bekommen ist:

SubGroup691_FE7IP11_2017-12-12.sldasm" & rem "/bin/parts/Loft-Project.sldasm" & rem "" 
SubGroup691_FE7IP12_2017-12-12.sldasm" & rem "/bin/parts/Loft-Project.sldasm" & rem "" 
SubGroup691_FE7IP13_2017-12-12.sldasm" & rem "/bin/parts/Loft-Project.sldasm" & rem "" 

ich diese gleiche Linie außerhalb der Schleife verwenden können, und ohne ENABLEDELAYEDEXPANSION wie folgt aus:

@ECHO OFF 
SETLOCAL 
SET "inputstring=Sub_Group691_FE7IP11_2017-12-12.sldasm_bin/parts/Loft-Project.sldasm_bin/parts/Loft-Project" 
SET "outputstring=%inputstring:.sldasm=.sldasm & rem "%" 
echo %outputstring% 

Die Ausgabe an das würde mir geben, was ich suche :

Sub_Group691_FE7IP11_2017-12-12.sldasm 

in Suche, beginne ich, dass rem zu denken, kann unter Verwendung eines falschen Trennzeichen nicht auf diese Weise verwendet werden, und ich muss zu einem Token-Trennzeichen Schleife zu bewegen.

Ich würde mich damit begnügen, dies zum Laufen zu bringen und mich nicht um "Gift" -Zeichen im Dateinamen zu sorgen, indem ich eifrig darum sorge, Dateien richtig zu benennen.

Vielen Dank für Ihre Hilfe!

Antwort

2

Der & rem Ansatz Strings nach rechts abschneiden kann nicht mit delayed expansion (!) arbeiten, stützt sie sich auf normal/sofortige Expansion (%). Dies liegt daran, dass die sofortige Erweiterung durchgeführt wird, bevor Befehle (wie rem) erkannt werden, aber die verzögerte Erweiterung danach erfolgt, sodass der Befehl rem niemals ausgeführt wird.

aber man konnte replace in der Schleife jeder .sldasm durch eine verbotene Zeichen wie | und teilen dann die Zeichenfolge durch eine for /F loop, wie folgt aus:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

set "InputFile=C:\Scratch\ASMExport.txt" 
set "OutputFile=C:\Scratch\InputFiles.txt" 
set "Extension=.sdlasm" 

> "%OutputFile%" (
    for /F usebackq^ delims^=^ eol^= %%A in ("%InputFile%") do (
     set "CurrentLine=%%A" 
     setlocal EnableDelayedExpansion 
     set "CurrentLine=!CurrentLine:%Extension%=|!" 
     for /F "delims=|" %%B in ("!CurrentLine!") do (
      endlocal 
      echo(%%B 
      setlocal EnableDelayedExpansion 
     ) 
     endlocal 
    ) 
) 

endlocal 
exit /B 

Verzögerte Expansion umgeschaltet wird, so dass keine for Variablen erweitert werden wenn es aktiviert ist, um den Verlust von oder Probleme mit Ausrufezeichen zu vermeiden.

+0

Vielen Dank für die Erklärung zur verzögerten Erweiterung, es war wirklich hilfreich! Ihr Beispiel ist genau das, was ich gesucht habe, und führte ein neues Konzept für mich ein (Ersetzen der Suchzeichenfolge durch ein verbotenes Zeichen). Das ist über den Tellerrand hinaus gedacht. Ihr Jungs (und Mädels) seid fantastisch! Nochmals vielen Dank, aschipfl! – embWalker

2
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q47788829.txt" 

FOR /f "usebackqtokens=1delims=/" %%a IN ("%filename1%") DO (
FOR /f "tokens=1*delims=." %%b IN ("%%a") DO (
    FOR /f "tokens=1*delims=_" %%d IN ("%%c") DO (
ECHO %%%%-a=%%~a %%%%-b=%%~b %%%%-c=%%~c %%%%-d=%%~d %%%%-e=%%~e ^<^< 
) 
) 
) 

GOTO :EOF 

Sie müssten die Einstellung von sourcedir zu ändern, um Ihre Umstände anzupassen.
Ich habe eine Datei mit dem Namen q47788829.txt verwendet, die Ihre Daten für meine Tests enthält.

Sie sollten in der Lage sein, Ihre erforderlichen Berichtsdaten aus den Elementen %%a .. %%e anzuzeigen, die angezeigt werden. Alles eine Frage der Verwendung tokens und delims konstruktiv.

+0

Funktioniert perfekt, danke Magoo! Das ist ordentlich und setzt es aus Teilen zusammen. Ich werde es auseinanderziehen und es bei jedem Schritt studieren. – embWalker

-1

Wenn Ihre Eingabe ist der Text, den Sie geschrieben haben, mit der gleichen Struktur, ich denke, dieser Stapel sollte funktionieren und extrahieren Sie die Namen, die Sie schnell wollen.

CODE:

@echo off 
setlocal enabledelayedexpansion 

set "inputFile=input.txt" 
set "outputFile=result.txt" 

for /f "delims=/ tokens=1" %%A in (%inputFile%) do (
    set "tempFileName=%%A" 
    echo !tempFileName:~0,-4!>> %outputFile% 
) 

Sie hatten nur die Variablen 'Eingabedatei' und 'output' auf Ihre Bedürfnisse anzupassen.