2017-09-12 2 views
1

Verwenden von Server 2016 hier mit einfacher Batch-Datei-Programmierung (für jetzt).Batch-Manipulationszeichenfolge nach Eingabevariable mit "= & rem."

Ich habe, was ich denke, ist ein einfaches Problem, nur dass ich nicht sehe eine praktikable Lösung vor mir jetzt. Ich werde meine Anfrage auf ein Testszenario beschränken, um es einfach zu halten. Was ich versuche, ist, einen String von rechts zu trimmen, bis er das aktuelle Jahr im Format "_% year% -" erreicht, wobei das Jahr von einer anderen Variablen kommt, in meinem Beispiel aber auf "static" gesetzt ist. Wo ich auf Probleme stoße, bezieht sich auf eine Variable aus dem Code, den ich habe.

Dies ist ein funktionierendes Beispiel eine Variable auf der rem Linie nicht verwenden, und gibt die gewünschte Ausgabe von „Machined_Cam-2286:“

@ECHO OFF 
SETLOCAL DisableDelayedExpansion 

set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS" 
set "systemYear=2017" 
set "yearModified=_%systemYear%-" 

echo "%testString%" | find "%yearModified%" >NUL || goto :EOF 

set testString=%testString:_2017-=&rem.% 

echo %testString% 

pause 

Sie, dass „_2017-“ sehen in auf hartcodiert die 10. Zeile. Was ich in einem rein logischen Sinn auf der rem Linie speziell zu tun, bin auf der Suche:

set testString=%testString:%yearModified%=&rem.% 

Aufgrund der Art und Weise dieser Befehl teststring in-line ändert, macht es schwierig, eine Variable hinein zu injizieren. Ich habe eine riesige Kombination aus Escape- und Erweiterungseinstellungen ausprobiert, um die Variable bisher ohne Erfolg zu erhalten. Ich habe auch versucht zu „bauen“ den Befehl als Zeichenfolge und versuchen, sie und Rohr auf eine Variable die Ausgabe zu nennen:

@ECHO OFF 
SETLOCAL DisableDelayedExpansion 

set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS" 
set "systemYear=2017" 
set "yearModified=_%systemYear%-" 

echo "%testString%" | find "%yearModified%" >NUL || goto :EOF 

set "callCMD=%%testString:%yearModified%=^&rem.%%" 

call %callCMD% > %testString% 

echo %testString% 

pause 

Dies scheint wie eine solche einfache Frage, aber mein Mangel an Verständnis für String-Manipulation unter DOS ist offensichtlich. Wie es aussieht, läuft der Rest des Skripts perfekt mit dem "_2017-" hart-codiert. Es wäre schön, dieses bisschen Wartung zu eliminieren.

Jede Hilfe oder Richtung wird geschätzt.

Vielen Dank.

+1

Warum Sie die verzögerte Erweiterung explizit deaktivieren? – Stephan

+0

Als eine Gewohnheit, ich normalerweise deaktivieren Sie es und aktivieren/deaktivieren Sie es nur, wenn ich Syntax häufig halten muss. Irgendeine Option ist auf dem Tisch, um das zu beheben, also sehe ich, warum es seltsam erscheinen mag, das explizit dort anzubringen. – GHTurbines

Antwort

1

Darf ich Ihnen eine andere Methode der Spaltung. Ersetzen Sie Ihre "Delimiterstring" mit einem richtigen Trennzeichen und verwenden Sie eine for zu teilen (for verwendet ein-Buchstaben-Trennzeichen). Das Aktivieren der verzögerten Erweiterung hilft, ist aber nicht notwendig.Wie Sie es explizit deaktiviert (Sie können Ihre Gründe haben), zeig ich dir beide:

@echo off 
set "TestString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS" 
set "CutHere=_2017" 

setlocal enabledelayedexpansion 
for /f "delims=§" %%a in ("!TestString:%CutHere%=§!") do set Result=%%~a 
echo enabled: %Result% 
endlocal 

setlocal disabledelayedexpansion 
for /f "delims=§" %%a in ('call echo "%%TestString:%CutHere%=§%%"') do set Result=%%~a 
echo disabled: %Result% 
endlocal 

Nur sicher sein, verwenden Sie ein Trennzeichen (§ hier), die sicherlich nicht in der Zeichenfolge sein (s).

+0

Vielen Dank! Dies scheint eine robustere Lösung für das Aufspalten von Strings zu sein und kann ohne DelayedExpansion funktionieren, und die Operation selbst ist eine Ein-Zeilen-Lösung für das, was das hinzufügt (einige Leute bevorzugen Lesbarkeit, andere Prägnanz). – GHTurbines

+0

Netter Trick +1. Es gibt keine Prüfung, ob CutHere überhaupt vorhanden ist, könnte mit 'tokens = 1,2 'und' wenn "%% b" neq "" (Ergebnis = %% a) gemacht werden sonst exit/b 1' – LotPings

+0

@LotPings : Wenn es kein Trennzeichen gibt, würde ich erwarten, dass es die ganze Zeichenfolge zurückgibt, aber ja, andere haben andere Erwartungen/Bedürfnisse. – Stephan

0

Sie versuchen, zu kontrollieren, was Sie rufen Sie den Inhalt einer Variablen

mit versuchen stattdessen eine temporäre Datei mit -

echo %%testString:%yearModified%=^&rem.%%" > temp.bat 
call temp.bat > %testString% 
+0

Danke! Ich war in der Lage, Ihre Syntax mit einigen Änderungen zu verwenden, um den Befehl aus der Temp-Batch-Datei zu verarbeiten. Ich werde mich daran erinnern müssen, wie das in Zukunft funktioniert. – GHTurbines

0

Sie NEED verzögerte Erweiterung für diese Art der Operation, so enabe es.

  • Ich schlage vor, zunächst den Rest der Zeichenfolge dieses
  • und aus der ursprünglichen Zeichenfolge zu erhalten.

@ECHO OFF 
SETLOCAL EnableDelayedExpansion 

set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS" 
set "systemYear=2017" 
set "yearModified=_%systemYear%-" 

echo "%testString%" | find "%yearModified%" >NUL || goto :EOF 

set tempString=!testString:*%yearModified%=! 
set testString=!testString:%yearModified%%tempstring%=! 

echo %testString% 

pause 

Beispielausgabe:

Machined_Cam-2286 
+0

Vielen Dank! Dies funktionierte sehr gut und verzögerte DelayedExpansion. Ich füge diese Syntax meiner Toolbox hinzu. – GHTurbines

Verwandte Themen