2015-09-11 1 views
0

Je suppose que je suis assez fou pour utiliser un fichier batch, en premier lieu, mais ce problème m'a arracher les cheveux! Le script de lot ci-dessous habituellement fonctionne très bien. Cependant, lors de la première exécution, une erreur "La syntaxe de la commande est incorrecte" sera générée; et il le fera jusqu'à ce que je sorte tout, l'exécute, et puis le REM. Ensuite, il recommence à fonctionner comme par magie!Inconsistent "La syntaxe de la commande est incorrecte" erreur

@echo off 

REM Create processed data directory 
set "PROCDIR=processed" 
mkdir %PROCDIR% 2>nul 

REM Loop through CSV files and process them 
for %%f in (*.csv) do (
    set "in=%%~nf" 
    set "input=%%~nxf" 
    set "out_lang=%PROCDIR%\%in%_lang.csv" 
    set "out_spr=%PROCDIR%\%in%_spr.csv" 
    set "out_ajt=%PROCDIR%\%in%_ajt.csv" 

    echo Processing %input% 

    REM Split input file appropriately 
    REM FIXME Hardcoded line ranges are brittle 
    sed -n "1,2p" %input% > %out_lang% 
    sed -n "3,55p" %input% > %out_spr%.tmp 
    sed -n "56,$p" %input% > %out_ajt%.tmp 

    REM Unpack SPR data 
    REM n.b., Needs gawk 4, or later 
    gawk -f spr.awk %out_spr%.tmp > %out_spr% 
    del %out_spr%.tmp 

    REM Substitute AJT data values 
    REM n.b., -i seems to be buggy in Windows 
    sed -f ajt.sed %out_ajt%.tmp > %out_ajt% 
    del %out_ajt%.tmp 
) 

Si je REM le @echo off, il semble qu'il est défaillant parce que la substitution de variable parfois - pour des raisons inconnues - ne fonctionne pas. Puis, quand il arrive à sed, il abandonne tout simplement.

Je suppose qu'il me manque quelque chose ... Des idées ce que ce pourrait être !? (En plus de mes billes!)

+0

Rien de drôle, juste alphanumérique avec des traits de soulignement et des tirets (mais il baulks même sur 'test.csv'!). Je vais vérifier la nomenclature, mais je suis sûr que c'est juste en UTF-8; et je ne vois rien là-dedans qui le rendrait indiscernable de ASCII-7, si cela fait aussi la différence ... Merci pour le conseil :) – Xophmeister

+3

si un script se comporte différemment la première fois que dans les exécutions suivantes, c'est habituellement un indice fort pour le [retarder l'expansion] (http://stackoverflow.com/a/30284028/2152082) (oui - je vois, c'est votre problème) – Stephan

Répondre

2

Si je pouvais donner des conseils, utiliser et abuser de la commande PAUSE, ECHO et y échapper les caractères ^. Aussi Ctrl-C pour arrêter le script pendant un PAUSE.

Voici une version déboguée:

@echo off 

SETLOCAL 
REM Create processed data directory 
set "PROCDIR=processed" 
echo mkdir %PROCDIR% 2^>nul 

REM Loop through CSV files and process them 
for %%F in (*.csv) do (
    set "in=%%~nF" 
    echo in: %in% 
    set "input=%%~nxF" 
    echo input: %input% 
    set "out_lang=%PROCDIR%\%in%_lang.csv" 
    set "out_spr=%PROCDIR%\%in%_spr.csv" 
    set "out_ajt=%PROCDIR%\%in%_ajt.csv" 

    echo Processing %input% 
PAUSE 

    REM Split input file appropriately 
    REM FIXME Hardcoded line ranges are brittle 
    echo sed -n "1,2p" %input% ^> %out_lang% 
    echo sed -n "3,55p" %input% ^> %out_spr%.tmp 
    echo sed -n "56,$p" %input% ^> %out_ajt%.tmp 
PAUSE 

    REM Unpack SPR data 
    REM n.b., Needs gawk 4, or later 
    echo gawk -f spr.awk %out_spr%.tmp ^> %out_spr% 
    echo del %out_spr%.tmp 
PAUSE 

    REM Substitute AJT data values 
    REM n.b., -i seems to be buggy in Windows 
    echo sed -f ajt.sed %out_ajt%.tmp ^> %out_ajt% 
    echo del %out_ajt%.tmp 
PAUSE 

) 
ENDLOCAL 
GOTO :EOF 
EXIT /B 0 

j'ajouté setlocal enabledelayedexpansion et cela semble résoudre les erreurs variables non déclarées.

Voici une version de travail (vous devez supprimer tous les echo redondants et carets ^):

@echo off 
setlocal enabledelayedexpansion 

REM Create processed data directory 
set "PROCDIR=processed" 
echo mkdir %PROCDIR% 2^>nul 

REM Loop through CSV files and process them 
for %%F in (*.csv) do (
    set "in=%%~nF" 
    echo in: !in! 
    set "input=%%~nxF" 
    echo input: !input! 
    set "out_lang=!PROCDIR!\!in!_lang.csv" 
    set "out_spr=!PROCDIR!\!in!_spr.csv" 
    set "out_ajt=!PROCDIR!\!in!_ajt.csv" 

    echo Processing !input! 
PAUSE 

    REM Split input file appropriately 
    REM FIXME Hardcoded line ranges are brittle 
    echo sed -n "1,2p" !input! ^> !out_lang! 
    echo sed -n "3,55p" !input! ^> !out_spr!.tmp 
    echo sed -n "56,$p" !input! ^> !out_ajt!.tmp 
PAUSE 

    REM Unpack SPR data 
    REM n.b., Needs gawk 4, or later 
    echo gawk -f spr.awk !out_spr!.tmp ^> !out_spr! 
    echo del !out_spr!.tmp 
PAUSE 

    REM Substitute AJT data values 
    REM n.b., -i seems to be buggy in Windows 
    echo sed -f ajt.sed !out_ajt!.tmp ^> !out_ajt! 
    echo del !out_ajt!.tmp 
PAUSE 

) 
endlocal 
GOTO :EOF 
EXIT /B 0 
1

Stephan est à droite, le code de lot ne fonctionne pas à cause de ne pas utiliser l'expansion retardée au sein boucle FOR.

@echo off 
setlocal EnableDelayedExpansion 
REM Create processed data directory 
set "PROCDIR=processed" 
mkdir "%PROCDIR%" 2>nul 

REM Loop through CSV files and process them 
for %%f in (*.csv) do (
    set "in=%%~nf" 
    set "input=%%~nxf" 
    set "out_lang=%PROCDIR%\!in!_lang.csv" 
    set "out_spr=%PROCDIR%\!in!_spr.csv" 
    set "out_ajt=%PROCDIR%\!in!_ajt.csv" 

    echo Processing !input! 

    REM Split input file appropriately 
    REM FIXME Hardcoded line ranges are brittle 
    sed -n "1,2p" "!input!" >"!out_lang!" 
    sed -n "3,55p" "!input!" >"!out_spr!.tmp" 
    sed -n "56,$p" "!input!" >"!out_ajt!.tmp" 

    REM Unpack SPR data 
    REM n.b., Needs gawk 4, or later 
    gawk -f spr.awk "!out_spr!.tmp" >"!out_spr!" 
    del "!out_spr!.tmp" 

    REM Substitute AJT data values 
    REM n.b., -i seems to be buggy in Windows 
    sed -f ajt.sed "!out_ajt!.tmp" >"!out_ajt!" 
    del "!out_ajt!.tmp" 
) 
endlocal 

Chaque variable d'environnement référencé dans un bloc défini par ( ... ) est dilatée par le processeur de commande déjà sur l'analyse du bloc entier. Sur l'une des pages d'aide de sortie dans une fenêtre d'invite de commande sur l'exécution de if /? explique cela en détail.

Cela a été vu lors de l'exécution du code de lot en question sans la première ligne à partir d'une fenêtre d'invite de commande. Exécuter un fichier de commandes à partir d'une fenêtre d'invite de commande sans echo off ou avec echo on doit être utilisé sur le débogage du code de lot ne fonctionne pas comme prévu.

Et dans le cas de tout fichier CSV dans le répertoire courant contient 1 ou plusieurs espaces dans le nom de fichier, il est nécessaire d'inclure toutes les références de fichiers entre guillemets pour avoir un code de travail pour ces fichiers.