11 Stimmen

Gibt es eine Entsprechung zu "cut -c" in Windows cmd.exe?

Ich habe einige Dateien mit fester Zeilengröße und fester Feldgröße, aus denen ich Informationen extrahieren muss. Normalerweise würde ich Cygwin verwenden ( cut et al), aber das ist in diesem Fall aufgrund der (dummen) Managementpolitik, die ich nicht ändern kann, keine Option. Es hat mit den in Windows enthaltenen XP-Standardwerkzeugen durchgeführt werden.

Ich muss die 10 Zeichen an Offset 7 und 4 Zeichen an Offset 22 (nullbasiert) extrahieren und in eine Datei ausgeben, allerdings mit einer kleinen Abweichung:

  • Das erste Feld kann ein negatives, positives oder kein Vorzeichen haben (am Anfang oder Ende). Das Vorzeichen sollte nach vorne verschoben oder ganz entfernt werden, wenn es positiv ist.
  • Bei dem zweiten Feld sollten führende und nachfolgende Leerzeichen entfernt werden.

Zum Beispiel:

          1         2         3          <- ignore (these lines not in file,)
0123456789012345678901234567890123456789 <- ignore ( here only for info.)
xxxxxxx    15.22-yyyyyABCDzzzzzzzzzzz...
xxxxxxx   122.00+yyyyy XX zzzzzzzzzzz...
xxxxxxx         9yyyyyYYY zzzzzzzzzzz...

erzeugen sollte ( < zeigt das Ende der Zeile an):

-15.22,ABCD<
122.00,XX<
9,YYY<

6voto

Daren Thomas Punkte 64742

Auf dieser Website finden Sie einige Hinweise zum Extrahieren von Teilzeichenfolgen in cmd.exe: http://www.dostips.com/DtTipsStringManipulation.php

Diese Website schlägt vor, dass Sie Folgendes verwenden können

%varname:~2,3%

um eine Variable tiefzustellen. Dies scheint Ihre Bedürfnisse zu erfüllen, außer dass Sie jetzt jede Zeile in eine Variable übertragen müssen.

Als Nächstes wollen Sie sich die grässlichen for Schleifen-Syntax und if und Verzweigungen (Sie können zu :labels im Batch).

Das ist zwar alles ziemlich hässlich, aber wenn man schon mal dabei ist...

Hier ist eine Seite in SO, auf der es darum geht, Dateien in einer Schleife durchzugehen und etwas mit ihnen anzustellen: Wie kann man mit einer Windows-Batch-Datei eine Schleife durch jede Zeile einer Textdatei ziehen?

6voto

ghostdog74 Punkte 305138

Wenn Sie mit einem modernen Windows arbeiten, sind Sie nicht auf cmd.exe-Befehle beschränkt, Sie können vbscript verwenden. Wenn es Ihre Politik ist, auch vbscript nicht zu verwenden, dann sollten Sie wohl Ihr Management entlassen :)

Set objFS=CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file"
Set objFile = objFS.OpenTextFile(strFile)
strFirstLine = objFile.ReadLine
Do Until objFile.AtEndOfStream
    strLine= objFile.ReadLine
    var1 = Mid(strLine,10) ' do substring from position 10 onwards
    ' var2 = Mid (strLine,<pos>,<length>) ' get next offset and save to var2
    WScript.Echo var1 & var2  ' print them out.
Loop

Um Zeichen aus einer Zeichenkette "auszuschneiden", verwenden Sie die Funktion Mid(). vbscript-Dokumentation um mehr zu erfahren.

Speichern Sie die obige Datei als test.vbs und führen Sie in der Befehlszeile Folgendes aus

c:\test> cscript /nologo test.vbs > newfile

Natürlich kann "substring" auch mit der reinen cmd.exe durchgeführt werden, aber ich überlasse es anderen, Sie anzuleiten.

Aktualisierung durch Pax: Ausgehend von dieser Antwort habe ich mir das Folgende ausgedacht, das ein guter Anfang sein wird:

option explicit
dim objFs, objFile, strLine, value1, value2

if wscript.arguments.count < 1 then
    wscript.echo "Usage: process <input-file>"
    wscript.quit
end if

set objFs=createObject("Scripting.FileSystemObject")
set objFile = objFs.openTextFile(wscript.arguments.item(0))
do  until objFile.atEndOfStream
    strLine= objFile.readLine
    value1 = trim(mid(strLine, 8, 10))
    value2 = trim(mid(strLine, 23, 4))
    if right(value1,1) = "-" then value1 = "-" & left(value1,len(value1)-1)
    if right(value1,1) = "+" then value1 = left(value1,len(value1)-1)
    if left(value1,1) = "+" then value1 = mid(value1,2)
    wscript.echo value1 & "," & value2
loop

Das entspricht allen Anforderungen, die wir hatten. Wir können die Offsets und Längen später zu Befehlszeilenargumenten machen.

Update beenden.

4voto

Lumi Punkte 14158

Hier ist ein kleines Skript (muss in einer BAT/CMD-Datei gespeichert werden), das den Vorschlag von Daren Thomas erweitert:

@echo off
setlocal
set key=HKCU\Software\Microsoft\Windows\CurrentVersion\Ext\Stats\{D27CDB6E-AE6D-11CF-96B8-444553540000}\iexplore\AllowedDomains

echo.
echo Liste der fuer Flash im IE zugelassenen Domaenen:
echo =================================================
for /f "usebackq tokens=11 delims=\" %%l in (`call reg query "%key%" /s`) do echo. %%l
echo.
endlocal

Die FOR-Schleife ist der zentrale Teil. Beachten Sie die Verwendung von Befehlsmodifikatoren in doppelten Anführungszeichen. Ich gebe an tokens=11 denn ich bin nur an den Unterschlüsseln von AllowedDomains die sich an Position 10 befindet.

Lesen Sie unbedingt die Hilfe in for /? . Daren hat Recht, wenn er sagt, dass dieses Zeug ziemlich hässlich ist. Und es bricht leicht zusammen, wenn man es modifiziert. Es gibt eine Menge nicht-intuitiver Feinheiten mit cmd.exe Skript-Syntax.

Übrigens ist die GUID die COM-Klassen-ID für das Shockwave Flash Add-on. Sie lautet gibt es mindestens seit 2001 und könnte daher auch in absehbarer Zukunft von Bedeutung sein. Der Zweck des Skripts ist es, die Bereiche aufzulisten, in denen Flash, das ich vorzugsweise standardmäßig blockiere wurde zugelassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X