2016-03-26 4 views
1

Ich versuche, ein einfaches CMD-Skript zu schreiben, um den Build meines Repos zu automatisieren. Hier ist das Skript in seiner Gesamtheit:Warum erhalte ich einen Syntaxfehler mit diesem CMD-Skript?

@echo off 
setlocal 

goto main 

:: Functions 

:buildSubdir 

pushd %1 
for /f %%projectFile in ('dir /b /s project.json') do (
    dnu restore "%%projectFile" 
    dnu build "%%projectFile" 
    dnu pack "%%projectFile" 
) 
popd 
goto :EOF 

:main 

:: Check for dnu 
where dnu > NUL 2>&1 
if %ERRORLEVEL% NEQ 0 (
    echo dnu wasn't found in your PATH! 1>&2 
    echo See http://docs.asp.net/en/latest/getting-started/installing-on-windows.html for instructions on installing the DNX toolchain on your PC. 1>&2 
    exit /b %ERRORLEVEL% 
) 

:: Do the actual work 
cd %~dp0 
call :buildSubdir src 
call :buildSubdir test 

Im Grunde ist es was tut, ist zu versuchen, alle Dateien zu finden project.json in einigen ausgewählten Verzeichnissen mit dem Namen (src und test), und führen Sie dnu restore, dnu build und dnu pack auf sich .

Aus irgendeinem Grund scheint ich einen Syntaxfehler in der Zeile, wo ich eine for /f Schleife eingeben, etwas über %projectFile nicht erkannt zu werden. Here's ein Kern der vollen Ausgabe von meinem Terminal, wenn ich die @echo off Anweisung entfernen und das Skript erneut ausführen.

Kann mir jemand sagen, warum das passiert und was ich tun kann, um es zu beheben? Vielen Dank.


edit: geändert einfach es dazu:

for /f %%p in ('dir /b /s project.json') do (
    set projectFile=%%p 
    dnu restore "%projectFile%" 
    dnu build "%projectFile%" 
    dnu pack "%projectFile%" 
) 

noch nicht zu funktionieren scheint, obwohl die Fehlermeldungen jetzt unterschiedlich sind. Here's ein Kern des neuen Ausgangs. (Beachten Sie, dass %projectFile% auf die leere Zeichenfolge festgelegt ist).

+0

Variablen in Batch-Dateien lesen mit '%', so wäre es '% project%' sein. Sie referenzieren es auch in einer 'for'-Schleife, also müssen Sie' setlocal enabledelayedexpansion' verwenden. –

+0

@KenWhite Nicht in 'for/f' Schleifen ... –

+0

In 'for' Schleifen werden sie mit'! ', Als'! Projektdatei! 'Referenziert. Ich habe meinen Kommentar bearbeitet. :-) Sie müssen auch verzögerte Expansion aktivieren. –

Antwort

1
for /f "delims=" %%p in ('dir /b /s /a-d project.json') do (
    dnu restore "%%p" 
    dnu build "%%p" 
    dnu pack "%%p" 
) 

Der Verzeichnisname so zu %%p zugeordnet ist denn das ist alles, was Sie verwenden, haben Sie keine Notwendigkeit haben, es weiter zu vergeben.

Die delims= stellt sicher, dass die gesamte Linie zu %%p zugeordnet ist - ansonsten wird %%p das erste Token die Standardtrennzeichen gesetzt, das praktische Ergebnis, die unter Verwendung zugewiesen werden, ist der Name auf den ersten Raum trunkieren.

Siehe

for /? 

von der Eingabeaufforderung für DOCCO.

Die /a-d alle und Ordner vom dir Ausgang entfernt (nur für den Fall gibt es ein Verzeichnisname der Maske geliefert passend - kleine Möglichkeit, obwohl das sein könnte)

Wenn Sie wollten würde den Namen in %%p eher manipulieren Anstatt es nur so zu verwenden, wie es ist, hätten Sie entweder delayedexpansion verwenden oder eine andere Routine aufrufen müssen, um die Manipulation durchzuführen.The basis of this characteristic is the delayedexpansion Falle - batch will substitute the *parse-time* value of any% var% it finds in a code-block (parenthesised series of statements) for% var% vor der Ausführung, so da %projectFile% zu Beginn der for Schleife nicht definiert wurde, wird Batch ersetzen Sie es mit nichts die zu diesem Zeitpunkt sein Wert ist.

Zur Dokumentation finden Sie viele, umgeben viele Artikel hier im Zusammenhang mit delayedexpansion oder die spärliche Dokumentation in

set /? 
+0

Super Antwort, Sie haben alle Punkte angesprochen, die ich in meiner Frage hatte (und dann einige). Ich habe nur eine Frage , macht es hier einen Unterschied, ob 'delims = 'zitiert wird oder nicht? –

+1

@JamesKo: Die" offizielle Syntax "ist, dass die Modifikatoren zitiert werden - siehe' for /? 'von der Eingabeaufforderung Macken werden ausgenutzt, so dass es möglich ist, die Modifikatoren * nicht * zu zitieren - aber ich habe sie nie gebraucht. – Magoo

+0

Danke für die Erklärung, Magoo.: D –

0

Mit dem For-Konstrukt verwenden Sie Buchstaben als Variablen: a-z und A-Z (es ist wichtig zu beachten, dass die Groß- und Kleinschreibung beachten) im Konstrukt For. Es gibt eine Reihe von Möglichkeiten, die Sie für FOR verwenden können und ich würde hier beginnen - http://ss64.com/nt/for_f.html

Sie können auch FOR /? Hilfe bei Bedarf erhalten.

Ich glaube, Sie sind für diese Suche:

@echo off 
setlocal 

goto main 

:: Functions 

:buildSubdir 

pushd %1 
for /f %%p in ('dir /b /s project.json') do (
    dnu restore "%%p" 
    dnu build "%%p" 
    dnu pack "%%p" 
) 
popd 
goto :EOF 

:main 

:: Check for dnu 
where dnu > NUL 2>&1 
if %ERRORLEVEL% NEQ 0 (
    echo dnu wasn't found in your PATH! 1>&2 
    echo See http://docs.asp.net/en/latest/getting-started/installing-on-windows.html for instructions on installing the DNX toolchain on your PC. 1>&2 
    exit /b %ERRORLEVEL% 
) 

:: Do the actual work 
cd %~dp0 
call :buildSubdir src 
call :buildSubdir test 
+0

Braucht eine bessere Erklärung ... du bist derjenige, der die Frage beantwortet. :( –

+0

@JamesKo - Ich habe aktualisiert und bereinigt meine Antwort so hoffentlich macht es mehr Sinn. – Leptonator