tulskie
Goto Top

Content mit Schleife auslesen

Moin zusammen,
vielleicht kann mir ja jemand weiter helfen da ich ein wenig am verzweifeln bin.

Ich möchte die Datei QUELLE einlesen und dann die Zeilen 81,40,68 in eine Variable schreiben.
Dort kommt aber kein Wert an und trotz aller Suche finde ich den Fehler nicht.

set "quelle=%HOMEDRIVE%%HOMEPATH%\QUELLE"
set "content="

REM Den gesamten Inhalt der Datei "QUELLE" in die Variable "content" einlesen
for /f "usebackq delims=" %%i in ("%quelle%") do (
set "content=!content!%%i"
)

REM Daten aus "content" verarbeiten
for %%a in (81 40 68) do (
for /F "tokens=1,* delims=:" %%b in ("%%a") do (
set "line=!content:~%%b,%%c!"
if "%%b"=="81" (
set "mnum=!line:~5,3!"
) else if "%%b"=="40" (
set "Bewertung=!line:~1,100!"
) else if "%%b"=="68" (
set "PDM=!line!"
)
)
)

Content-Key: 8085279880

Url: https://administrator.de/contentid/8085279880

Printed on: May 15, 2024 at 04:05 o'clock

Member: michi1983
michi1983 Aug 09, 2023 updated at 07:01:38 (UTC)
Goto Top
Hallo,

nutze doch bitte die code Tags, damit dein Quellcode schöner und lesbarer dargestellt wird.
Formatting instructions in the posts

Zu deiner Frage, hier ein Beispiel mit Powershell (von Chatgpt kopiert, weil ich selbst eine Flasche bin was scripting angeht):

$sourceFilePath = "C:\path\to\your\file\Quelle.txt"  
$lineNumbersToExtract = @(40, 68, 80)

# Initialize variables to store the extracted lines
$line40 = $null
$line68 = $null
$line80 = $null

# Check if the source file exists
if (Test-Path $sourceFilePath -PathType Leaf) {
    # Read the content of the file
    $fileContent = Get-Content -Path $sourceFilePath -Raw
    $fileLines = $fileContent -split "`r`n"  # Split content into lines  

    # Iterate through the specified line numbers and extract the lines
    foreach ($lineNumber in $lineNumbersToExtract) {
        if ($lineNumber -gt 0 -and $lineNumber -le $fileLines.Length) {
            $line = $fileLines[$lineNumber - 1]
            
            # Assign the line content to the appropriate variable
            if ($lineNumber -eq 40) {
                $line40 = $line
            } elseif ($lineNumber -eq 68) {
                $line68 = $line
            } elseif ($lineNumber -eq 80) {
                $line80 = $line
            }
        } else {
            Write-Host "Line $lineNumber does not exist in the file."  
        }
    }
} else {
    Write-Host "Source file not found."  
}

# Output the extracted lines (optional)
$line40
$line68
$line80

Und hier eine Alternative in Batch/Shell:

@echo off
setlocal

set "sourceFilePath=C:\path\to\your\file\Quelle.txt"  
set "lineNumbersToExtract=40 68 80"  

for %%n in (%lineNumbersToExtract%) do (
    for /f "usebackq tokens=* skip=%%n delims=" %%l in ("%sourceFilePath%") do (  
        set "line=%%l"  
        goto :found
    )
    echo Line %%n does not exist in the file.
    set "line="  
    :found
    if %%n == 40 set "line40=!line!"  
    if %%n == 68 set "line68=!line!"  
    if %%n == 80 set "line80=!line!"  
)

echo Extracted lines:
echo Line 40: %line40%
echo Line 68: %line68%
echo Line 80: %line80%

endlocal

Gruß

P.S: @7907292512 oder @colinardo werden uns gleich einen Einzeiler um die Ohren hauen der das Gleiche kann face-wink
Member: Tulskie
Tulskie Aug 09, 2023 at 07:16:08 (UTC)
Goto Top
Moin michi1983,

danke für die schnelle Antwort.
Beim ausführen kommen diese Fehler.
%n delims=" was unexpected at this time.
Line 40 does not exist in the file.
%n delims=" was unexpected at this time.
Line 68 does not exist in the file.
%n delims=" was unexpected at this time.
Line 81 does not exist in the file.
Extracted lines:
Line 40: !line!
Line 68: !line!
Line 80:

Ich habe dann ein more %sourceFilePath% mal eingefügt um zu sehen ob auf die richtige Datei zugegriffen wird.
Das war okay.
Mitglied: 7907292512
7907292512 Aug 09, 2023 updated at 07:21:20 (UTC)
Goto Top
Ich möchte die Datei QUELLE einlesen und dann die Zeilen 81,40,68 in eine Variable schreiben.
Pillepalle in Powershell
$var1,$var2,$var3 = (Get-Content test.txt)[39,67,80]
https://tio.run/##K8gvTy0qzkjNyfn/30GdKyo1MyfVEEIZQShjCGXCpe6gUKOQX1qimw ...

Batch ruhe in frieden. Leichenfledderei kommt nicht gut ...
Member: michi1983
michi1983 Aug 09, 2023 updated at 07:27:29 (UTC)
Goto Top
Quote from @7907292512:
Pillepalle in Powershell
$var1,$var2,$var3 = (Get-Content test.txt)[39,67,80]
Mit Ansage face-smile

Batch ruhe in frieden. Leichenfledderei kommt nicht gut ...
full ack
Member: Tulskie
Tulskie Aug 09, 2023 at 07:28:11 (UTC)
Goto Top
Moin Siddius,
kann ich von Batch den Pfad mit übergeben und das Ergebnis wieder zurück in Batch bringen?
Member: Tulskie
Tulskie Aug 09, 2023 at 07:30:32 (UTC)
Goto Top
okay, dann ist das aber keine Lösung für mich, sorry
Mitglied: 7907292512
Solution 7907292512 Aug 09, 2023 updated at 08:17:04 (UTC)
Goto Top
Zitat von @Tulskie:
kann ich von Batch den Pfad mit übergeben und das Ergebnis wieder zurück in Batch bringen?

Kann man selbstredend, aber wieso sollte man so einen Schwachfug machen? Entweder gleich Powershell in Gänze oder Batch, beides zusammen ist hier überflüssiger overhead.

Naja Batch wird wohl nicht sonderlich begeistert sein wenn wir seine Totenruhe stören ... aber ### drauf, die Batchies werden's wohl nie von ihrer Umgebung weg schaffen face-big-smile.
@echo off
set "quelle=D:\datei.txt"  
for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%quelle%"') do (  
    if %%a==40 set "var1=%%b"  
    if %%a==68 set "var2=%%b"  
    if %%a==81 set "var3=%%b"  
)
echo %var1%
echo %var2%
echo %var3%

und tschüss ....
Member: Tulskie
Tulskie Aug 09, 2023 at 08:44:39 (UTC)
Goto Top
Super, so komm ich mit ein paar Anpassungen zurecht.
Danke Siddius
Member: Tulskie
Tulskie Aug 09, 2023 at 09:01:16 (UTC)
Goto Top
Kannst du mir nochmal weiterhelfen?
Wie baue ich den Aufruf um wenn ich nach einer Zeichenkette suchen möchte?

for /f "tokens=1* delims=:" %%a in ('findstr /C: "^" "%part%"') do (

set "quelle=D:\datei.txt"    
for /f "tokens=1* delims=:" %%a in ('findstr /C: "^" "%quelle%"') do (    
    if %%a==Text1 set "var1=%%b"    
    if %%a==Text2 set "var2=%%b"    
    if %%a==Text3 set "var3=%%b"    
)
echo %var1%
echo %var2%
echo %var3%
Mitglied: 7907292512
7907292512 Aug 09, 2023 updated at 09:07:30 (UTC)
Goto Top
Wie baue ich den Aufruf um wenn ich nach einer Zeichenkette suchen möchte?
Inhalt ist immer in %%b kannst du z.B. in der Schleife an findstr pipen und darin suchen.
@echo off
set "quelle=D:\datei.txt"    
for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%quelle%"') do (    
    echo.%%b|findstr /ilc:"Whatever" >nul 2>&1 && set "var1=%%b"    
)
echo %var1%
Member: Tulskie
Tulskie Aug 09, 2023 updated at 09:12:01 (UTC)
Goto Top
Ich kenne aber die Zeilennummer in diesem Fall nicht.
Dazu kommt das ich nur mit dem 3ten token vergleichen darf.
Mitglied: 7907292512
7907292512 Aug 09, 2023 updated at 09:20:54 (UTC)
Goto Top
Zitat von @Tulskie:

Ich kenne aber die Zeilennummer in diesem Fall nicht.
Brauchst du ja nicht wenn du nach Text suchst.
Dazu kommt das ich nur mit dem 3ten token vergleichen darf.
Einfach in die Schleife eine weitere For-Schleife setzen die die Zeile in Ihre Tokens zerlegt, welche das bei dir sind weiß hier ja keiner, so no input no output. Ich weiß nicht wie sich die Leute das hier immer vorstellen wir hätten Glaskugel 3.0 die alles sieht "koppschüttel".

Tja und mit Powershell und Import-Csv wärst du mit sowas in null komma nix mit nem Einzeiler fertig. Da siehst du mal wieder die kruden Nachteile die Batch hat X-Zeilen Code für einfachste Aufgaben.
Member: Tulskie
Tulskie Aug 09, 2023 at 09:35:20 (UTC)
Goto Top
Ich komm aber nicht drum herum das in batch zu machen.

so sieht die Datei aus:
PART_LASER_LENGTH = 0
PART_PIERCING_PNT = 0
PART_PATH_CORR = 0
PART_ROT_INCREMENT = 4

suchen muss ich, nach dem ersten Leerzeichen, den Begriff (PART_ROT_INCREMENT),
ausgeben muss ich dann den Wert nach dem = (4)

und das sollte möglichst ohne großen Zeitverlust gehen.

Bisheriger code:
set Las1=%PNHOMEDRIVE%%PNHOMEPATH%\PART.DAT
for /f "tokens=3 " %%j in ('findstr /C:" PART_LASER_LENGTH" %Las1%') do set  Las=%%j & goto :out2  
:out2
set /A Las=%Las%/1

set Einstech1=%PNHOMEDRIVE%%PNHOMEPATH%\PART.DAT
for /f "tokens=3 " %%j in ('findstr /C:" PART_PIERCING_PNT" %Einstech1%') do set  Einstech=%%j & goto :out3  
:out3
set /A Einstech=%Einstech%/1

set WKZWE1=%PNHOMEDRIVE%%PNHOMEPATH%\PART.DAT
for /f "tokens=3 " %%j in ('findstr /C:" PART_TOOL_USED" %WKZWE1%') do set  WKZWE=%%j & goto :out4  
:out4
rem wandle den Text aus der Variable Einstech in eine Zahl um.
set /A WKZWE=%WKZWE%/1
Mitglied: 7907292512
7907292512 Aug 09, 2023 updated at 09:51:50 (UTC)
Goto Top
Datei-Inhalt
PART_LASER_LENGTH = 0
PART_PIERCING_PNT = 0
PART_PATH_CORR = 0
PART_ROT_INCREMENT = 4
Code
@echo off
set "quelle=D:\datei.txt"  
for /f "usebackq tokens=1,2 delims== " %%a in ("%quelle%") do (  
    if "%%a" == "PART_ROT_INCREMENT" set "var1=%%b"  
)
echo %var1%
Ergebnis
4

Tutorial zur FOR-Schleife

Mit Powershell wieder ein Einzeiler
Get-Content D:\test.txt -Raw | ConvertFrom-StringData
Name                           Value                                                                                                                             
----                           -----                                                                                                                             
PART_ROT_INCREMENT             4                                                                                                                                 
PART_PATH_CORR                 0                                                                                                                                 
PART_PIERCING_PNT              0                                                                                                                                 
PART_LASER_LENGTH              0      
Zum Auswählen von bestimmten
Get-Content D:\test.txt -Raw | ConvertFrom-StringData | ? Name -eq 'PART_ROT_INCREMENT' | select -Expand Value  

Ich bin jetzt raus, schon zu viel Leichen für umme gefleddert... 🖖
Member: Tulskie
Tulskie Aug 09, 2023 at 11:29:56 (UTC)
Goto Top
kein Problem, du hast mir sehr weitergeholfen.
Besten Dank