Domanda

Uno script di funzionamento che sposta vari file in base al nome del file esegue correttamente. Dopo averlo fatto dello script, controllerà due directory per eventuali file persistenti utilizzando IF EXIST *.txt. Questo funziona con grande tranne che ho notato alcuni file senza estensione. Questi non erano un problema prima e poiché ciò non può essere aiutato a causa dei processi fuori dal mio controllo, ho bisogno di modificare il mio script.

La mia unica idea è il seguente codice. Sopportare come ci sono due condizioni:

:check1
PUSHD "\\UNC\path1" &&(
DIR /A-D *.
IF %errorlevel% NEQ 0 GOTO check2
) & POPD

:add1
ECHO Add note to the log file

:check2
PUSHD "\\UNC\path2" &&(
DIR /A-D *.
IF %errorlevel% NEQ 0 GOTO laststep
) & POPD

:add2
ECHO Add note to the log file

:laststep
Some other code before exiting
.

Questo dovrebbe essere eseguito DIR sul percorso e se esistono file senza estensioni, avrà %errorlevel% Zero e passerà al prossimo assegno. Se ci sono file NO presente, avrà %errorlevel% non zero (probabile 1) e aggiungerà un po 'di testo al registro prima del controllo successivo. Controllare che due faranno lo stesso.

Questo sembra essere terribilmente complicato e non sono in grado di trovare una soluzione "one-lineer" che è facile come IF EXIST. Mi rendo conto che posso usare *. ma che restituisce le directory e può causare un %errorlevel% errato.

Codice aggiornato

Dove normalmente metto le mie variabili, anche i SET i due percorsi per eseguire DIR contro. In questo modo possono essere usati più facilmente altrove e bypassare l'errore del percorso UNC che normalmente ottengo - ragioni per cui non sono sconosciute. Il controllo del file aggiornato, utilizzato solo per i file senza un'estensione, è:

DIR %p1% /b /a-d|FIND /v "." && ECHO Found 1 >> %log%
DIR %p2% /b /a-d|FIND /v "." && ECHO Found 2 >> %log%
FINDSTR /I "Found" %log%
IF %errorlevel% EQU 0 GOTO stillthere

:nofiles
Some code
GOTO domore

:stillthere
Some code

:domore
Other code before exit
.

Grazie per le risposte, ho imparato da questo.

È stato utile?

Soluzione

è questo ciò che vuoi trovare?

dir /b /a-d |find /v "."
.

Altri suggerimenti

@ECHO OFF
SETLOCAL
:check1
PUSHD "u:\path1"
DIR /A-D *. >NUL 2>NUL
IF %errorlevel% EQU 0 ECHO Add note \path1 to the log file
POPD

PUSHD "u:\path2"
DIR /A-D *. >NUL 2>NUL
IF %errorlevel% EQU 0 ECHO Add note \path2 to the log file
POPD

:laststep
:: Some other code before exiting

GOTO :EOF
.

I tuoi problemi includono:

Entro una dichiarazione di blocco (a parenthesised series of statements), il blocco intero è analizzato e quindi eseguito.Qualsiasi %var% all'interno del blocco verrà sostituito da tale valore della variabile al momento in cui viene analizzato il blocco - prima che il blocco venga eseguito - la stessa cosa si applica a un FOR ... DO (block).

Quindi, IF (something) else (somethingelse) verrà eseguito utilizzando i valori di %variables% al momento in cui viene riscontrato il IF.

E si sta potenzialmente saltando da una staffa PUSHD/POPD che significherebbe il tuo POPD non ripristinerà necessariamente la directory di avvio.

(Nota che ho usato u:\ anziché un server in base al mio sistema)

Stai già utilizzando && per verificare PUSHD ha funzionato.Puoi fare lo stesso con il tuo DIR /-D.Trovo che rende la vita più facile.Inoltre, probabilmente si desidera nascondere qualsiasi messaggio di errore se *. non viene trovato, soprattutto perché questa è la condizione prevista.Ho anche nascosto la visualizzazione di qualsiasi file che potrebbe essere trovato, ma si può certamente sbarazzarsi di quel reindirizzamento.Potresti anche voler nascondere il messaggio di errore se Pushd fallisce, ma non l'ho implementato.

PUSHD "\\UNC\path1" && (
  DIR /A-D *. 1>nul 2>nul && ECHO Add note to the log file
  POPD
)

PUSHD "\\UNC\path2" && (
  DIR /A-D *. 1>nul 2>nul && ECHO Add note to the log file
  POPD
)

ECHO Some other code before exiting
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top