none
Batch - mi sto perdendo in un bicchier d'acqua RRS feed

  • Domanda

  • Devo fare uno stupidissimo batch che esamini i file presenti in una cartella, estrapoli dal nome di tali file un paio di dati che andranno inseriti in variabili e, in base a queste variabili, sposti il suddetto file in una determinata cartella. STOP

    I file (XLSX) sono generati da un programma e sono nominati con la data e l'ora di creazione, in questo modo: 10_08_18_23_00_00.xlsx (file prodotto il 10/8/2018 alle ore 23:00:00).

    Io devo prendere il valore del mese (08) e dell'anno (18) e, di conseguenza, spostare questo file in una cartella \2018\08-AGOSTO\

    Faccio l'estrapolazione delle variabili con il seguente ciclo FOR:

    SETLOCAL ENABLEDELAYEDEXPANSION

    for /r %%i in (*.xlsx) do ( 

    set _nomefile=%%~ni

    echo nome: %_nomefile% (solo per verifica)

    set _mm=%_nomefile:~3,2%%
    set _aa=%_nomefile:~6,2%%

    )

    Primo problema: La variabile "_nomefile" viene valorizzata correttamente, ma se cerco di leggerla in quel modo (tra %) restituisce valore vuoto. Se, invece, modifico la riga così:

    echo nome: !_nomefile!

    La variabile risulta corretta, solo che non funziona comunque il resto del batch, infatti le variabili "_mm" e "_aa" non prendono mai il valore corretto.

    Dove sbaglio?

    venerdì 10 agosto 2018 13:47

Risposte

  • Piuttosto che cercare di spiegarti come funziona l'espansione ritardata ho preferito riscrivere il tuo batch, segue qualche link a corredo per capire

    @echo off
    setlocal
    Rem mi posiziono nel folder dove si trovano i files
    pushd c:\temp
    :: se operi sul singolo folder sei sicuro di non sovrascrivere i file. fino a quando non ti sposti
    ::for /f "tokens=1* delims=?" %%i in ('dir  /b *.xlsx') do call :_elab "%%i"
    
    :: Con il seguente comando, se hai file con nomi = in folder diversi 
    :: questi  verranno sovrascritti nella copia ... 
    for /r %%i in (*.xlsx) do call :_elab "%%i"
    goto :EOF
    :_elab
    set file="%~1"
    set nomefile="%~n1"
    set mm=%nomefile:~4,2%%
    set aa=%nomefile:~7,2%%
    
    REM Assumo che esista c:\2018 e le sottodir 01 02 03 .. 12
    REM Togliere echo per attivare il batch
    echo copy %file%  c:\20%aa%\%mm%
    
    goto :EOF

    https://ss64.com/nt/delayedexpansion.html

    https://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/4095133#4095133

    Ciao Gas

    PS: forse uno script in powershell o un misto powershell/batch sarebbe stato più semplice


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere


    venerdì 10 agosto 2018 22:19
    Moderatore
  • lo stesso script in powershell

    
    
    cd c:\temp
    dir *.xlsx | ForEach-Object {
        $destination="c:\temp\20{2}\{1}\$($_.name)"  -f ($_.basename -split '_')
        echo "copy-item $_ -Destination $destination"
       }

    ciao gas


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere


    sabato 11 agosto 2018 10:20
    Moderatore

Tutte le risposte

  • Piuttosto che cercare di spiegarti come funziona l'espansione ritardata ho preferito riscrivere il tuo batch, segue qualche link a corredo per capire

    @echo off
    setlocal
    Rem mi posiziono nel folder dove si trovano i files
    pushd c:\temp
    :: se operi sul singolo folder sei sicuro di non sovrascrivere i file. fino a quando non ti sposti
    ::for /f "tokens=1* delims=?" %%i in ('dir  /b *.xlsx') do call :_elab "%%i"
    
    :: Con il seguente comando, se hai file con nomi = in folder diversi 
    :: questi  verranno sovrascritti nella copia ... 
    for /r %%i in (*.xlsx) do call :_elab "%%i"
    goto :EOF
    :_elab
    set file="%~1"
    set nomefile="%~n1"
    set mm=%nomefile:~4,2%%
    set aa=%nomefile:~7,2%%
    
    REM Assumo che esista c:\2018 e le sottodir 01 02 03 .. 12
    REM Togliere echo per attivare il batch
    echo copy %file%  c:\20%aa%\%mm%
    
    goto :EOF

    https://ss64.com/nt/delayedexpansion.html

    https://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/4095133#4095133

    Ciao Gas

    PS: forse uno script in powershell o un misto powershell/batch sarebbe stato più semplice


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere


    venerdì 10 agosto 2018 22:19
    Moderatore
  • lo stesso script in powershell

    
    
    cd c:\temp
    dir *.xlsx | ForEach-Object {
        $destination="c:\temp\20{2}\{1}\$($_.name)"  -f ($_.basename -split '_')
        echo "copy-item $_ -Destination $destination"
       }

    ciao gas


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere


    sabato 11 agosto 2018 10:20
    Moderatore
  • In effetti il comando Powershell è più "snello", ma avendo poca familiarità (anzi, ZERO) col linguaggio e dovendo aggiungere anche altri parametri (il mese scritto per esteso), ho optato per il batch opportunamente adattato e funziona alla grande

    Grazie

    mercoledì 29 agosto 2018 10:10