Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Frage Entwicklung Batch & Shell

GELÖST

Prozentzeichen in einer Variable erkennen

Mitglied: Araziel

Araziel (Level 1) - Jetzt verbinden

12.08.2010, aktualisiert 14:54 Uhr, 4905 Aufrufe, 13 Kommentare

Hallo, ich habe mal wieder ein Problem.

Ich sitze noch an dem Zeichen-Prüf Skript das ich hier: http://www.administrator.de/index.php?content=147238 schon einmal angesprochen hatte.

Nun habe ich das Problem das % Zeichen nicht erkannt werden die in einem Dateinamen vorkommen könnten.
Wie sie z.B. bei Downloads vorkommen.

Das % Zeichen fehlt schon wenn ich es mir aus dem dir Befehl übergeben lasse:

01.
for /f "delims=" %%a in ('dir %laufwerk%: /b /s /a:-d') do call :zerlegen "%%a"
Leider habe ich keine Ahnung woran dies liegen könnte, geschweige denn wie ich es umgehen kann.

Gruß
Sascha
Mitglied: pieh-ejdsch
12.08.2010 um 15:31 Uhr
moin Sascha,

Prozentzeichenhaltige ausgaben setzt Du am besten vor dem CALL in eine Variable und fragst diese Variable dann in der SubRoutine ab .

Gruß Phil
Bitte warten ..
Mitglied: mathe172
12.08.2010 um 16:40 Uhr
Hallo Araziel!

Im Normalfall Maskiert man solche Zeichen so(Bin mir bei % nicht sicher):
01.
%Variable:%=^%%
Evtl. musst du noch zwei ^^ mehr machen (im extremfall sogar vier). Leider weiss ich nicht genau wo man es einsetzen soll.
Versuchs einfach mal. (Probieren geht über studieren)

Mathe172
Bitte warten ..
Mitglied: Araziel
12.08.2010 um 17:23 Uhr
Die Übergabe klappt jetzt besten dank erstmal ,
leider macht der findstr noch noch Probleme.
Werde mich damit aber erst wieder Morgen beschäftigen um den kopf etwas frei zu bekommen.

Gruß
Sascha
Bitte warten ..
Mitglied: jeb-the-batcher
12.08.2010 um 18:47 Uhr
Das mit dem maskieren von % Zeichen klappt so generell nicht, da die % Zeichen als erstes interpretieret werden, lange bevor das Escape Zeichen beachtet wird.

Das gleiche Problem wird daher vermutlch dann auch beim findstr auftreten, sprich das % löst sich in Wohlgefallen auf.
01.
echo XYZ^% 
02.
echo hallo
Ausgabe:
01.
XYZecho hallo
Das liegt daran, das zuerst das % komplett verschwindet, und dann ^ als multiline Zeichen interpretiert wird.

Man kann aber %% verwenden um ein % zu erhalten, ist aber meistens nicht mehr nötig wenn man das % bereits einer Variabel zugewiesen hat.
Bitte warten ..
Mitglied: Biber
12.08.2010 um 21:22 Uhr
Moin Araziel,

nun macht da nicht so viel Heckmeck drum.

Kleiner Demo-Schnipsel (2zeilige Batchdatei namens "F:\Schnipsel\Test%20.cmd"):
01.
@if "%2"=="" %0 MfGBiber %%2 
02.
@for /f "delims=" %%i in ('dir/s /b f:\schnipsel\*%20*.*') do @(echo [a] %%i) & (echo [b] %%i|findstr "%20")
Proof-of-concept:
01.
>dir/s /b f:\schnipsel\*%20*.* 
02.
f:\schnipsel\ABC%20DEF%20GHIJKLMN%20.pdf 
03.
f:\schnipsel\Das%20ist%20ein%20Test%20.txt 
04.
f:\schnipsel\Gib%20mir%20bitte%20Leerstellen.doc 
05.
f:\schnipsel\Gib%20mir%20bitte%20Leerstellen.docx 
06.
f:\schnipsel\Test%20.cmd 
07.
f:\schnipsel\RenBsp\test %20 blöd%.txt 
08.
 
09.
(=21:20:15  D:\temp=) 
10.
>"f:\schnipsel\Test%20.cmd" 
11.
[a] f:\schnipsel\ABC%20DEF%20GHIJKLMN%20.pdf 
12.
[b] f:\schnipsel\ABC%20DEF%20GHIJKLMN%20.pdf 
13.
[a] f:\schnipsel\Das%20ist%20ein%20Test%20.txt 
14.
[b] f:\schnipsel\Das%20ist%20ein%20Test%20.txt 
15.
[a] f:\schnipsel\Gib%20mir%20bitte%20Leerstellen.doc 
16.
[b] f:\schnipsel\Gib%20mir%20bitte%20Leerstellen.doc 
17.
[a] f:\schnipsel\Gib%20mir%20bitte%20Leerstellen.docx 
18.
[b] f:\schnipsel\Gib%20mir%20bitte%20Leerstellen.docx 
19.
[a] f:\schnipsel\Test%20.cmd 
20.
[b] f:\schnipsel\Test%20.cmd 
21.
[a] f:\schnipsel\RenBsp\test %20 blöd%.txt 
22.
[b] f:\schnipsel\RenBsp\test %20 blöd%.txt
wo ist das Problem?

Grüße
Biber
Bitte warten ..
Mitglied: Biber
13.08.2010 um 10:18 Uhr
Nachtrag zu meinem Kommentar von gestern abend
[Edit -- ungeschickt gepostet... der gemeinte Kommentar von gestern abendsteht UNTERHALB dieses Kommentars.--/Edit]

Gestern abend war ich ein wenig im Zeitdruck... vielleicht fehlt ein bisschen die Erläuterung. Reiche ich jetzt nach.

Also, Ausgangpunkt war folgendes Szenario:
in dem Batch gibt es sinngemäß einen Aufrauf (von oben kopiert:
for /f "delims=" %%a in ('dir %laufwerk%: /b /s /a:-d') do call :zerlegen "%%a"
a) Falls in dem Parameter %1 des Call-Blocks (== das, was als Laufvariable %%a übergeben wird und einem Dateinamen entspricht)
zufällig ein Namensbestandteil "%20" enthalten ist, dann wird das "%2" als Parameter %2 aufgelöst und --> somit zu "nichts"===einem Leerstring.

b) Der Grund für den "%20"-Teilstring ist, dass eben auch in anderen Sprachen bestimmte Zeichen "naskiert" werden müssen.
"%20" ist eine "maskierte" Schreibweise für das Leerzeichen=Dez(32)=Hex(20) => und 0x20h wird als "%20" geschriben.

c) Gute Nachricht ist: auch andere Zeichen müssen eventuell maskiert werden, weil sie in Dateienamen erlaubt sind, aber nicht in URLs.
Aber: niemals nicht Zeichen kleiner als dez(32) = hex(20) = "%20" --> die sind nämlich in Dateinamen nicht erlaubt (und auch unüblich).

d) daraus folgt- maskierte Zeichenfolgen, die in der Batchverarbeitung abgefangen werden müssen, können zwar "%20", "%2x"....."%3x....."%4x".." sein, aber nienich mit "%1" beginnen.

Somit kann doch einfach der Call-Block-Aufruf geändert werden auf:
for /f "delims=" %%a in ('dir %laufwerk%: /b /s /a:-d') do call :zerlegen "%%a" %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9
Anm.. mehr als Parameter %1... %9 kann es wiederum im Batch nicht geben.

In dem called block ":zerlegen" wird dann jeder (vermeintliche) Parameter %2 übersetzt zur Zeichenkette "%2" (ohne Anführungs-Zeichen).
Und somit eben auch die Zeichenkette "f:\schnipsel\Test%20.cmd" zu (nicht lachen jetzt!) "f:\schnipsel\Test%20.cmd".
As should do.... mehr wollten wir auch nicht.

Grüße
Biber
Bitte warten ..
Mitglied: jeb-the-batcher
13.08.2010 um 10:44 Uhr
Zitat von Biber:
Somit kann doch einfach der Call-Block-Aufruf geändert werden auf:
for /f "delims=" %%a in ('dir %laufwerk%: /b /s /a:-d') do call :zerlegen 
> "%%a" %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9 
> 
Anm.. mehr als Parameter %1... %9 kann es wiederum im Batch nicht geben.

Grüße
Biber

Aber dann klappt bereits %A0 nicht mehr, jenes ist wiederum als URL durchaus erlaubt

01.
@for /f "delims=" %%i in ('dir/s /b f:\schnipsel\*%20*.*') do @(echo [a] %%i) & (echo [b] %%i|findstr "%20")
Funktioniert, aber löst ja gerade nicht das Problem, wenn man den Kram in einer Funktion weiter bearbeiten möchte.
Bitte warten ..
Mitglied: Araziel
13.08.2010 um 11:27 Uhr
Hi,
besten dank nochmal nun klappt es wunderbar.

Gruß
Sascha
Bitte warten ..
Mitglied: Biber
13.08.2010 um 14:18 Uhr
Zitat von jeb-the-batcher:
Aber dann klappt bereits %A0 nicht mehr, jenes ist wiederum als URL durchaus erlaubt
Keine Ahnung, was du meinst.
Wenn ich mit "%A0" oder "%a0" im Dateinamen und dem gestern geposteten Schnipsel teste:
>echo (_X_) ;-)>"F:\Schnipsel\Test%20%A0%a0.txt" 
 
(=14:11:14  D:\temp=) 
>"f:\schnipsel\Test%20.cmd" 
[a] f:\schnipsel\ABC%20DEF%20GHIJKLMN%20.pdf 
[b] f:\schnipsel\ABC%20DEF%20GHIJKLMN%20.pdf 
[a] f:\schnipsel\Das%20ist%20ein%20Test%20.txt 
[b] f:\schnipsel\Das%20ist%20ein%20Test%20.txt 
[a] f:\schnipsel\Gib%20mir%20bitte%20Leerstellen.doc 
[b] f:\schnipsel\Gib%20mir%20bitte%20Leerstellen.doc 
[a] f:\schnipsel\Gib%20mir%20bitte%20Leerstellen.docx 
[b] f:\schnipsel\Gib%20mir%20bitte%20Leerstellen.docx 
[a] f:\schnipsel\Test%20.cmd 
[b] f:\schnipsel\Test%20.cmd 
[a] f:\schnipsel\Test%20%A0%a0.txt 
[b] f:\schnipsel\Test%20%A0%a0.txt 
[a] f:\schnipsel\RenBsp\test %20 blöd%.txt 
[b] f:\schnipsel\RenBsp\test %20 blöd%.txt
Hast du mal ein Beispiel, was "klappt bereits %A0 nicht mehr" bedeutet?

Funktioniert, aber löst ja gerade nicht das Problem...
Hey, genau das ist doch unser Job und unser Anspruch in der IT..
Bitte warten ..
Mitglied: pieh-ejdsch
22.08.2010 um 13:30 Uhr
moin Biber,

Kleiner Demo-Schnipsel:
01.
@if "%2"=="" %0 MfGBiber %%2 
02.
> @for /f "delims=" %%i in ('dir/s /b f:\schnipsel\*%20*.*') do @(echo [a] %%i) & (echo [b] %%i|findstr "%20")
Proof-of-concept:
01.
> >dir/s /b f:\schnipsel\*%20*.* 
02.
> ... 
03.
> (=21:20:15  D:\temp=) 
04.
> >"f:\schnipsel\Test%20.cmd" 
05.
> .... 
06.
> [a] test0.txt 
07.
> [b] test0.txt 
08.
> ... 
09.
> 
Hast Du da nicht das Zweite % für darstellung von Prozent im Batch vergessen?

wie gewünscht findet der Befehl auf der CMD-Line
dir/s /b f:\schnipsel\*%20*.*
alle Dateien/Objekte die im Namen zwischendurch das %20 enthalten

der schnipsel jedoch sucht und findet nach Dateien welche im Namen zwischendurch eine 0 haben.

Gruß Phil
Bitte warten ..
Mitglied: Biber
23.08.2010 um 08:13 Uhr
Moin PH,

sorry, kann ich zumindest an dem Win XP/SP3-Rechner, an dem ich es damals wie auch heute getestet habe nicht nachvollziehen.

Bei mir werden mit dem zitierten Demo-Zweizeiler nur Dateien gefunden, die explizit die drei Zeichen "%20" am Stück enthalten.

In meinem F:\Schnipsel-Verzeichnis habe ich damals wie heute insgesamt 6 Dateien mit einem "%20" im Namen (siehe oben).
Dateien mit einer "0" im Namen (wie z.B. "Datei01.txt", "Datei02.txt" etc werden insgesamt 22 gefunden.

Bei einem "DIR f:\schnipsel\*%20*.*" vom CMD-Prompt wie auch beim "f:\schnipsel\Test%20.cmd" erhalte ich 6 Dateien as designed.

Unter welchem OS hast du denn getestet?

Grüße
Biber
Bitte warten ..
Mitglied: pieh-ejdsch
23.08.2010 um 17:38 Uhr
Ahhrg Kopfklatsch!

ich hatte Dummerweise nur die Zweite Zeile als Batch genommen.

Dafür bin ich nun dahintergestiegen was Du mit
In dem called block ":zerlegen" wird dann jeder (vermeintliche) Parameter %2 übersetzt zur Zeichenkette "%2" (ohne Anführungs-Zeichen).
meintest

da hab ich nochmal Deinen Korrekten Batch ohne die @ vor den Befehlen laufen lassen und da hab ich ertmal geschnallt - AHA - 2.Parameter wird zu %2 im selbstaufgerufenen Batch.
sorry für meinen lange Leitung.

aber einen hab ich noch: Warum wird der nachfolgende Befehl der zuerst aufgerufenen Batch nicht angezeigt - müsste das nicht weiterlaufen? oder geht das nur mit call oder start?

PS. läuft natürlich unter Win 7 sowie XP-mode oder XP-home SP3
Gruß Phil
Bitte warten ..
Mitglied: Biber
23.08.2010 um 18:16 Uhr
Moin Phil,

sei mir nicht böse, wenn ich montags gar nicht erst versuche, deinen Nickname gezielt über meine Tastatur zu erzeugen...

ad "warum wird der nachfolgende Befehl...nicht angezeigt...?"

Weil er die zweite Zeile ja niemals erreicht, wenn kein zweiter Parameter übergeben wurde.

Ich hatte ja als Demo-Schnipsel dieses hier gepostet (um nochmalige Missverständnisse zu vermeiden diesmal mit Header):
01.
:: --Der Demo-Batch "F:\Schnipsel\Test%20.cmd"--- 
02.
@if "%2"=="" %0 MfGBiber %%2 
03.
@for /f "delims=" %%i in ('dir/s /b f:\schnipsel\*%20*.*') do @(echo [a] %%i) & (echo [b] %%i|findstr "%20")
In der Zeile 02 /der ersten "echten" Zeile wird ja ein eventuell vorhandener Parameter %2 abgefragt.
Ebenfalls in dieser Zeile heisst es:
  • Wenn KEIN Parameter %2 dann führe aus %0 MfgBiber %%2
Was übersetzt bedeutet:
  • Wenn KEIN Parameter %2 dann führe aus ["F:\schnipsel\test%20.cmd" mit Parameter %1 (=Text: "MfGBiber") und %2 (Text ="%%2")
Da es kein "Call michselbst.cmd" und kein "Start "any Title" michSelbst.cmd" ist, wird auch der Batch dort nicht fortgesetzt.
Er kommt einfach nicht wieder.

[--kleine nicht wichtige Anekdote dazu--]
In ganz ganz uralten Zeiten, als DOS noch Clearasil benutzte und die FDP noch Politiker hatte, da haben einige Bätcher ihren Code "lesbar" gemacht dadurch, dass sie irgendwo in ein Verzeichnis des Suchpfades %path% eine Null-Byte-große oder nur aus einer leeren Zeile bestehende Batchdatei namens "Stop.bat" gelegt haben.

In einem kryptischen Batch kam dann in einem (unrettbaren) Fehlerzweig einfach die Anweisung "IF ERRORLEVEL 1 Stop"
Daraufhin wird .."Stop" gesucht... als interner Befehl, als ausführbare Datei im aktuellen Verzeichnis und dann im Pfad... und gefunden.
Ausgeführt... und tja.. sofort ist Schluss.
Gatesseidank haben sich die Bätcher und die FDP seitdem weiterentwickelt.
[/--kleine nicht wichtige Anekdote dazu--]


Back to thread: Ein-Nicht-Demo-Batch würde natürlich nicht als ERSTEN Parameter ein "MfgBiber" nutzen und fest verdrahtet ein Verszeichnis "F:\Schnipsel" durchflöhen, sondern sinnvollerweise in diese Richtung verfeinert werden:
01.
:: --Etwas verfeinerter Batch "F:\Schnipsel\QSStufe%20.cmd"--- als ERSTER Parameter wird ein Lw/Verzeichnis erwartet 
02.
@if "%2"=="" %0 "%~1" %%2 
03.
@for /f "delims=" %%i in ('dir/s /b "%~1:\*%20*.*"') do @(echo [a] %%i) & (echo [b] %%i|findstr "%20")
Dann würde auch alles wieder in EINE Zeile passen, wie es sich für Oneliner gehört...*gg

Grüße
Biber
Bitte warten ..
Ähnliche Inhalte
Festplatten, SSD, Raid
Wie erkenne ich ein RAID?
gelöst Frage von Hendrik2586Festplatten, SSD, Raid8 Kommentare

Guten Morgen an alle. :) Kurze Frage zum Thema Raid. Unser Server hat insgesamt 12 Platten á 450 GB. ...

Batch & Shell
Batch Script um txt Dateien in einem Ordner zu erkennen und in Variablen umwandeln das sie über ein Auswahlmenü gestartet werden können
gelöst Frage von DragonValorBatch & Shell3 Kommentare

Hallo, ich tue mir gerade ein wenig schwer mit dem erkennen von bestimmten Dateien in einem Ordner. Die For-Schleifen ...

Drucker und Scanner
Großformatscanner - Bildfehler ohne zoomen erkennen können
gelöst Frage von FL1991Drucker und Scanner3 Kommentare

Hallo zusammen, folgendes Problem: Wir haben einen Großformatscanner der Gebäudepläne bis 1,20m Breite und beliebiger Länge einscannt und dann ...

iOS
Jailbreak in Iphones erkennen
gelöst Frage von dragoroiOS2 Kommentare

Hallo zusammen, ich suche eine Möglichkeit bei einem Iphone zu erkennen ob ein Jailbreak durchgeführt worden ist oder nicht. ...

Neue Wissensbeiträge
Datenschutz

Teamviewer kommt für IoT-Geräte wie den Raspberry Pi

Information von magicteddy vor 1 StundeDatenschutz

Moin, jetzt werden IoT Geräte endgültig zur Wanze? Anscheinend kann man auf einem Dashboard seine Geräte visualisieren Ich stelle ...

Microsoft

Letzte Updates für Win10 und Server2016 müssen bei Bedarf über den Update catalogue in den WSUS importiert werden!

Tipp von DerWoWusste vor 6 StundenMicrosoft1 Kommentar

automatisch kommt da nichts an im WSUS und auch nicht im SCCM. Siehe Hinweise zum Bezug der jeweils neuesten ...

Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 3 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 3 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Heiß diskutierte Inhalte
Netzwerkmanagement
Preis für Wartungsvertrag ok?
Frage von a-za-zNetzwerkmanagement13 Kommentare

Hallo! Mal ne Frage, weil ich mich mit dem akzeptablen Preis für einen Reaktionszeitvertrag nicht auskenne. Meine Firma hat ...

Windows Netzwerk
Ist ein Portforwarding auf einen PC ohne lauschendes Programm ein (großes) Sicherheitsproblem?
Frage von PluwimWindows Netzwerk10 Kommentare

Hallo zusammen, zur Fernwartung eines Rechners an einem anderen Ort nutze ich VNC. Da dieser Rechner einfach nur eine ...

SAN, NAS, DAS
Wer kennt sich mit QNAP und CISCO aus ?
gelöst Frage von MachelloSAN, NAS, DAS10 Kommentare

Hallo Zusammen hier im Forum, Ich habe ein QNas 451+ und dieses NAS hat zwei GBit Lan Adapter die ...

Router & Routing
Firewall Homeoffice
Frage von leon123Router & Routing6 Kommentare

Hallo zusammen, ich möchte meine beiden Rechner von der Firma vom Heimbereich abtrennen. Die Fritzbox kann leider nur den ...