2017-07-07 1 views
2

Dieser Teil funktioniert gut, bis es ein kaufmännisches Und im Dateinamen ist, in diesem Fall stürzt es mein Skript vollständig ab.Batch: kaufmännisches Und verursacht Probleme mit findstr

Ich kann nicht einfach den Dateinamen in Anführungszeichen setzen, weil ich die Zeichenfolge am Anfang finden muss. Wie kann ich beides machen?

Antwort

4

Für Befehlszeile Gebrauch:

echo %file^name:^&=^^^&% | ... 

Innerhalb einer Batch-Datei

echo %%filename:^&=^^^&%% | ... 

Wie funktioniert es?
Wenn eine Pipe zwei neue cmd.exe-Instanzen erstellt, wird die echo ... zweimal analysiert.
Der Trick ist, den Dateinamen nur in der zweiten Erweiterung zu erweitern.
Und dann zu erweitern und ersetzen Sie die & mit ^&, um Probleme mit der & zu vermeiden.
Der Caret wird verwendet, um dem kaufmännischen Und-Zeichen zu entgehen und wird selbst entfernt. In der zweiten Erweiterung sieht der Parser nur echo %filename:&=^&%.

Um die Erweiterung in den zweiten Parse-Schritt zu erzwingen, müssen die Prozentzeichen für Batch-Dateien verdoppelt werden.
Von der Befehlszeile aus funktioniert dies nicht, aber ein einfacher Eintrag an einer beliebigen Stelle im Variablennamen funktioniert.

Alternative Lösung:

echo "%filename%" | findstr /i /b /c:^"\"%filename% (%year%)\"" 

Dies fügt einfach zitiert und verwendet zitiert auch in dem Suchausdruck

+0

entkommen, Doppel Entkommen und zwingt Doppelanalyse, verzögerte Expansion zu entkommen ... manchmal bin ich immer noch überrascht Diese Arbeit kann in der Tat getan werden ... – Stephan

+0

danke! ..meine ersten Schritte beim Erlernen all der Dinge, die Stephan erwähnt hat. – bricktop

2

Eine weitere Option ist verzögert Expansion zu verwenden, die eine explizite cmd mit der /v:on Option erfordert.

cmd /v:on /c "(echo !filename!)" | findstr /i /b /c:"%name% (%year%)" 

Wenn Ihre Batch-Skript bereits verzögerten Expansion aktiviert hat, dann Klammern um die linke Seite nötig sind, um das Auftreten innerhalb des übergeordneten Skript die verzögerte Expansion zu verhindern (siehe Why does delayed expansion fail when inside a piped block of code?). Der untergeordnete Prozess wird weiterhin standardmäßig auf die verzögerte Erweiterung deaktiviert, sodass die cmd /v:on /c ... weiterhin benötigt wird.

@echo off 
setlocal enableDelayedExpansion 
... 
(cmd /v:on /c "(echo !filename!)") | findstr /i /b /c:"%name% (%year%)" 

Ein anderer Weg, um die Expansion bis zum Teilprozess zu verzögern, ist die Erweiterung

@echo off 
setlocal enableDelayedExpansion 
... 
cmd /v:on /c "(echo ^!filename^!)" | findstr /i /b /c:"%name% (%year%)" 
+0

Sie haben die erforderliche, umschließende Klammer '(cmd/v: on/c" (echo! Filename!) ") | Vergessen ... '. Else 'filename =% path%' schlägt fehl – jeb

+0

@jeb - Ich nahm an, dass die verzögerte Erweiterung im Batch-Skript nicht aktiviert ist. Ja, wenn der Stapel die verzögerte Erweiterung aktiviert hat, werden die äußeren Klammern auf der linken Seite benötigt. – dbenham

Verwandte Themen