{title}

Bitte helfen Sie mir, das folgende Szenario zu programmieren: Inhalt von myfile.txt: Servername: KDB20122: Schwarz Vogel16: Schwarz Hund20: Schwarz Katze6: Tier15: Tier65: TierJetzt möchte ich "Tier" anhand seiner Nummer überprüfen, wenn diese Nummer (6 in unserem Fall)> 2 und <16 (Schwarz was auch immer) dann drucken Animal = Schwarz Birdsimilarly wenn 15> 16 und 15 <20 dann drucken Animal = Schwarz Dog wenn 65> 20 dann drucken Animal = Schwarz CatI am in der verzweifelten Notwendigkeit, dies zu tun, entweder mit Batch, VBs, Powershell. Sehr geschätzt!

Warum legen Sie nicht das ab, was wirklich in der Datei enthalten ist?

Servername: KDB2012 ADUsers-2: KALDB Developers16: KALDB ProdDevs20: KALDB BADATAREADER25: KALDB ZADATAREADER115: KALDB AREADER168: KALDB PREADER190: KALDB PWRITER192: KALDBEADER199ITER7: PWRITER KALDBDevelopment340: KALDBeadOnly-152: Kalvin Rodger183: Kalvin Rodger239: Kalvin Rodger289: Kalvin Rodger

Es werden 4 Zeilen gedruckt152: Kalvin Rodger152 ist größer als 115 und kleiner als 168, drucken Sie also Kalvin Rodger = KALDB AREADER183: Kalvin Rodger183 ist größer als 168 und kleiner als 190, drucken Sie also Kalvin Rodger = KALDB PREADER239: Kalvin Rodger239 ist größer als 192 und kleiner als 257, also Kalvin Rodger = KALDBEADER289 drucken: Kalvin Rodger289 ist größer als 261 und kleiner als 299, also Kalvin Rodger = KALDB SWRITERIst das richtig?

Richtig, und der Inhalt der Datei ist dynamisch. Sie werden sich von Zeit zu Zeit ändern. Die Gruppen und ihre Nummer sowie der ADUser und seine Nummer ändern sich ständig.

Irgendein Fortschritt?

Ich wusste nicht, dass wir auf der Uhr sind. Der schwierige Teil bestand darin, Teile der Datei für die individuelle Verarbeitung abzurufen.VBScript war eine mögliche Lösung, da es reguläre Ausdrücke unterstützt, Powershell jedoch auch. Code: $ file $ arrTitles = @ () $ arrEmps = @ () # Laden Sie die Jobtitel in Array # (Get-Content) -Path $ file) -match "^ {1,3}: {1,} {1,} $" | ForEach-Object {$ arrTitles + =, @ (:: ToDecimal ($ _. Split (":")), $ _. Split (":"))} $ arrTitles.GetEnumerator () | Sort-Object | Out-Null # Laden Sie die Mitarbeiter in das Array # (Get-Content -Path $ file) -match "^ {1,3}: {1,} s {1,} $" | ForEach-Object {$ arrEmps + =, @ (:: ToDecimal ($ _. Split (":")), $ _. Split (":"))} j -lt $ arrEmps.Count; $ j ++) {für ($ i = 0; $ i -lt $ arrTitles.Count - 1; $ i ++) {if (($ arrEmps -ge $ arrTitles) -und ($ arrEmps - le $ arrTitles)) `{Write-Host $ arrEmps," = ", $ arrTitles}}} Speichern Sie das Skript mit einer PS1-Erweiterung und führen Sie es an der Powershell-Eingabeaufforderung aus. Powershell durchsucht das aktuelle Verzeichnis nicht nach einem Skript. Verwenden Sie daher den Zeiger. , Wenn Sie auf das aktuelle Verzeichnis verweisen müssen. Die erste Codezeile ist der Dateiname. Ändern Sie nach Bedarf.

Gut gemacht, Sidewinder!

Ausgezeichnet! Vielen Dank.

Ich musste es nur beenden. Speichern mit.vbs-Erweiterungsaufruf mit cscript.exe // nologopass-Eingabedateiname als parameterexamplecscript // nologo Skriptname.vbs input.txtinput.txt.Code: Servername: KDB2012 ADUsers-2: KALDB Developers16: KALDB ProdDevs20: KALDB BADATAREADER25: KALDB ZADATAREADER115: KALDB AREADER168: KALDB PREADER190: KALDB PWRITER192: KALDBEADER257: KALDB WRITER261: KALDB SWRITER299: KALDB3: KALD Rodger289: Kalvin RodgerDas Skript.Code: Const ForReading = 1Const ForWriting = 2Set objFSO = CreateObject ("Scripting.FileSystemObject") Set ReadFile = objFSO.OpenTextFile (wscript.arguments (0), ForReading) Split (strText, vbCrLf) i = 3l = 0Dim LimitList () Do sline = arrFileLines (i) ReDim Preserve LimitList (l) LimitList (l) = slinel = l + 1i = i + 1Loop bis Mid (sline, 1,10) = "" Dim LimitValues ​​() Dim OutPutText () Für j = 0 Bis (UBound (LimitList) -1) MyString = LimitList (j) arrTokens = Split (MyString, ":") ReDim Preserve LimitValues ​​(j) LimitValues ​​(j) = arrtokens (0) ReDim Preserve OutPutText (j) OutPutText (j) = arrTokens (1) NextDim LookupCode () Für j = 0 bis (UBound ( LimitValues) -1) ReDim Preserve LookupCode (j) LookUpCode (j) & LimitValues ​​(j) & ") AND (numval <" & LimitValues ​​(j + 1) & ") Dann wscript.echo nameval &" & Chr (34) & "If (numval>" & LimitValues ​​(UBound (LimitValues)) & ") Dann wscript.echo nameval &" & Chr (34) & ":") numval = arrTokens (0) Nameval = arrTokens (1) Für k = 0 To UBound (LookUpCode) ExecuteGlobal LookUpCode (k) Next Nextoutput.Code: Kalvin Rodger = KALDB AREADERKalvin Rodger = KALDB PREADERKalvin Rodger = KALDBEADERKalvin Rodger = KALDB SWRITER

Viola großartig, mein Freund.

Aus Gründen der Genauigkeit habe ich festgestellt, dass die Powershell-Lösung einen schwerwiegenden logischen Fehler aufweist und das Cmdlet "Sort-Object" nicht ordnungsgemäß verwendet wird. Das Skript hat trotz der Fehler funktioniert, führt aber unter bestimmten Umständen zu ungenauen Ergebnissen. Eine neuere und bessere Version finden Sie weiter unten: Code: $ file = Join-Path -Path $ pwd -ChildPath myfile.txt $ arrTitles = @ () $ arrEmps = @ () # Laden Sie die Jobtitel in das Array # (Get-Content -Path $ file) -match "^ {1,3}: {1,} {1,} $" | Für jedes Objekt {$ arrTitles + =, @ ((:: ToDouble ($ _. Split (":"))) .ToString ("000"), $ _. Split (":"))} $ arrTitles = $ arrTitles | Sort-Object @ {Expression = {$ _}; Aufsteigend = $ true} # Laden Sie die Mitarbeiter in das Array # (Get-Content -Path $ file) -match "^ {1,3}: {1,} s {1,} $" | ForEach-Object {$ arrEmps + =, @ ((:: ToDouble ($ _. Split (":"))) .ToString ("000"), $ _. Split (":"))} # Lookups ausführen #for ($ j = 0; $ j -lt $ arrEmps.Count; $ j ++) {for ($ i = 0; $ i -lt $ arrTitles.Count - 1; $ i ++) {if ($ arrEmps -eq $ arrTitles)) `{Write-Host $ arrEmps," = ", $ arrTitles; break} if (($ arrEmps -ge $ arrTitles) -und ($ arrEmps -lt $ arrTitles)) `{Write-Host $ arrEmps," = ", $ arrTitles}}} Entschuldigen Sie etwaige Unannehmlichkeiten.

Ich habe auch meine Mühe verschönert.Code: Const ForReading = 1Set objFSO = CreateObject ("Scripting.FileSystemObject") 'Liest die gesamte Eingabedatei auf einmal in den String Set ReadFile = objFSO.OpenTextFile (wscript.arguments (0), ForReading ) strText = ReadFile.ReadAll Readfile.Close 'String in einzelne Zeilen aufteilenarrFileLines = Split (strText, vbCrLf) Dim LimitList () Dim LimitValues ​​() Dim OutPutText ()' Ersten Teil in Array holen 'Gespeicherte Datei bis zur zweiten gestrichelten Linie analysieren' Start bei 3rd lineInputLine = 3LimitLine = 0 'Dateizeilen einzeln lesenDo sline = arrFileLines (InputLine) ReDim LimitList (LimitLine) beibehalten LimitList (LimitLine) = slineLimitLine = LimitLine + 1InputLine = InputLine + 1Loop bis Mid (sline, 1,10) = "" 'InputLine zeigt jetzt auf die erste Zeile nach dem GedankenstrichDataStart = InputLine' Bandgrenzwerte abrufen 'Jede Zeile des ersten Blocks lesenFür j = 0 To (UBound (LimitList) -1)' Zeile in 2 Token teilen bei: characterarrTokens = Split ( LimitList (j), ":") ReDim Preserve LimitValues ​​(j) 'Das erste Token ist numerisch al valueLimitValues ​​(j) = arrtokens (0) ReDim Preserve OutPutText (j) 'Das zweite Token ist eine Textzeichenfolge für dieses bandOutPutText (j) = arrTokens (1) Next' Verarbeitet den zweiten Teil der Eingabedatei für j = DataStart To UBound (arrFileLines) ' Teilen Sie die Zeile in 2 Token auf bei: characterarrTokens = split (arrfilelines (j), ":") numval = Int (arrTokens (0)) Nameval = arrTokens (1) 'Für jede Zeile im zweiten TeilFür k = 0 To UBound (Grenzwerte) LineToWrite = nameval & "Erforderlicher Dateiname nicht angegebenQuitting" wscript.quit () End Iffile = WScript.Arguments (0) UpdateArrays-Datei, Domäne, userson-Fehler fortsetzen nexti = ubound (Benutzer), wenn err.number thenwscript.Echo "No users.Quitting "wscript.quitend ifi = ubound (domain) wenn err.number thenwscript.Echo" No domain.Quitting "wscript.quitend ifon error goto 0for i = ubound (domain) -1 to 0 Step -1for j = 0 To iif domain ( j)> domain (j + 1) thentemp = domain (j + 1) domain (j + 1) = domain (j) domain (j) = tempend ifnextnextfor i = 0 To ubound (Benutzer) for j = 1 To ubound ( domain) if (domain (j)> users (i)) Thentmparr = Split (Benutzer (i), ":") temp = tmparr ( 1) & ":") temp = temp & tmparr (1) wscript.echo tempexit forelseif Benutzer (i)> Domäne (ubound (domain)) thentmparr = Split (Benutzer (i), ":") temp = tmparr (1 ) & ":") temp = temp & tmparr (1) wscript.echo tempexit forend ifnextnextSub UpdateArrays (Datei, ByRef ar1, ByRef ar2) Const ForReading = 1Dim fso, infile, i1, i2, lineDim regex1, regex2, match , matches2Set regex1 = New RegExpSet regex2 = New RegExpregex1.Pattern = "^ d +: w + w + $" regex2.Pattern = "^ d +: w + s w + $" regex1.Global = Trueregex2.Global = TrueSet fso = CreateObject ("Scripting.FileSystemObject") if (Not fso.FileExists (file)) Die WScript.Echo-Datei & "existiert nicht. Quitting" WScript.Quit () End IfSet inFile = fso.OpenTextFile (file, ForReading ) i1 = 0i2 = 0Do While Not infile.AtEndOfStreamline = infile.ReadLineSet matches1 = regex1.Execute (line) Setze matches2 = regex2.Execute (line) für jede Übereinstimmung in matches1redim preserve ar1 (i1) line = Split (line, ": ") ar1 (i1) = Right (String (4," 0 ") & line (0), 4) &": "& line (1) i1 = i1 + 1next für jede Übereinstimmung in matches2redim behalte ar2 (i2) line = Split (Linie, ":") ar2 (i2) = R ight (String (4, "0") & line (0), 4) & ":" & line (1) i2 = i2 + 1nextloopinfile.close () End Sub

Ich mag keine unfertigen Geschäfte. Reguläre Ausdrücke (RegEx) sind schwer zu lesen, schwer zu schreiben und schwer zu pflegen. Wenn sich das Datenmuster wie im zweiten Beispiel ändert, muss sich auch der RegEx ändern. Mit ein wenig Hilfe von einem RegEx-Tool, ein paar Änderungen und viel Kopfzerbrechen ist Version 3.0 eingetroffen: Code: #Requires -Version 2.0 $ file = Join-Path -Path $ pwd -ChildPath myFile.txt $ arrGroups = @ () $ arrUsers = @ () # Lädt die Gruppen in das Array # (Get-Content -Path $ file) -match "^ {1,3}: {1,} ( s | S) {1, } $ "| Für jedes Objekt {$ arrGroups + =, @ ($ _. Split (":"), $ _. Split (":"))} $ arrGroups = $ arrGroups | Sort-Object @ {Expression = {$ _}; Aufsteigend = $ true} # Laden Sie die Benutzer in das Array # (Get-Content -Path $ file) -match "^ {1,3}: {1,} s {1,} $" | ForEach-Object {$ arrUsers + =, @ ($ _. Split (":"), $ _. Split (":"))} # Sucht nach ($ j = 0; $ j -lt $ arrUsers .Count; $ j ++) {für ($ i = 0; $ i -lt $ arrGroups.Count - 1; $ i ++) {if (($ arrUsers -eq $ arrGroups)) `{Write-Host $ arrUsers," = ", $ arrGroups; break} if (($ arrUsers -gt $ arrGroups) -und ($ arrUsers -lt $ arrGroups)) `{Write-Host $ arrUsers," = ", $ arrGroups; break} if (($ arrUsers -ge $ arrGroups)) `{Write-Host $ arrUsers," = ", $ arrGroups; Breche die $ file Variable enthält den Namen der Eingabedatei. Standardmäßig befinden sich sowohl das Skript als auch die Datei im aktuellen Verzeichnis, sodass Sie das Skript wie folgt ausführen können: . scriptname.ps1 Dies kann vom Benutzer geändert werden. Wenn sich das Eingabedatenmuster erneut ändert, haben Sie die Möglichkeit, die Änderungen vorzunehmen. Viel Glück

@ Oldun, bemerkenswert schnell und genau. Vielen Dank. @ SideWinderthis ist die perfekte Version, Prost! Sie alle verdienen ein Lob

Gaming-Motherboard

Sehr geehrter Computer, hoffe, AMD Dual-Core-Prozessor oder Intel Dual-Core-Prozessor Motherboars, die am besten für Spiele PCthankx ist

Viele Informationen bereits im Forum hier (dies wird fast täglich gefragt) und bei Google. Das Rad muss nicht neu erfunden werden.

Laut unten stehender Seite hat AMD das Gaming-Ding gewonnen. : -? Wir haben das Rad neu erfunden. //reviews.cnet.com/4520-10442_7-6389077-1.html

Pssst. Erzähl es nicht Track. Er wird implodieren.

F: Also, was hat er für einen Arzt? A: Schädelunterbringung. Sieht aus wie ein flacher alter Basketball, der bis zur Ernte im Herbst keine Heide mehr hat. : -? PsssT! > snip! Calum hat mir das neue Wort beigebracht, das Rob möchte, dass ich lerne, dass es ein bisschen wie LOL ist, aber du schnaubst viel, während du es tust.

Pssst. Erzähl es nicht Track. Er wird implodieren.

AMD gewann das Spiel gegen den Pentium D, nicht gegen Core 2 Duo. Keine Partei zu ergreifen, nur darauf hinweisend, dass der Vergleich veraltet ist.

Guter Punkt Calum. Danke. Ich glaube, ich war mehr in "Cranial Implodation" involviert: -? Der gute alte Tom und seine gute alte Hardware. www.tomshardware.com/2006/06/05/first_benchmarks_conroe_vs_fx-62/ Ich hoffe, sie unterstützen NES gut genug! Chortle + 2LOL's = 2LOLC-GAS. Der Ozean an der oberen Ostküste Afrikas hat Chortles, die an der Ostküste der Vereinigten Staaten Violenthurrikane verursachen. Diese werden als superLOL's bezeichnet.

Toms Hardware - fantastische Seite. Tolle Seite für Hardware-Informationen, Benchmarks und so weiter.

AMD Statement: Ich hätte gewonnen, bevor ich verloren habe. Dann gluckste das Publikum und ROTFL. Es war kein großer Schrei, aber die Schnauben waren LOL.

Beliebte Beiträge