Principale utente con più risposte
Batch - mi sto perdendo in un bicchier d'acqua

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?
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
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- Proposto come risposta NinoRCTNModerator sabato 11 agosto 2018 09:56
- Modificato GastoneCanaliModerator sabato 11 agosto 2018 10:00
- Contrassegnato come risposta Skywalker Senior mercoledì 29 agosto 2018 10:10
-
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
- Modificato GastoneCanaliModerator sabato 11 agosto 2018 10:21
- Contrassegnato come risposta Skywalker Senior mercoledì 29 agosto 2018 10:10
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
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- Proposto come risposta NinoRCTNModerator sabato 11 agosto 2018 09:56
- Modificato GastoneCanaliModerator sabato 11 agosto 2018 10:00
- Contrassegnato come risposta Skywalker Senior mercoledì 29 agosto 2018 10:10
-
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
- Modificato GastoneCanaliModerator sabato 11 agosto 2018 10:21
- Contrassegnato come risposta Skywalker Senior mercoledì 29 agosto 2018 10:10
-
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
- Modificato Skywalker Senior venerdì 31 agosto 2018 08:18