2017-10-16 2 views
0

J'ai un script batch qui fonctionne déjà depuis quelques mois. Le but du script est de créer un dossier basé sur le nom de fichier et de renommer le dossier en conséquence dans un certain but. Cependant, il arrête de déplacer les fichiers dans le dossier créé dans la boucle. Je l'ai testé sur une autre machine et cela fonctionnait bien, mais sur une machine particulière; ça ne marche tout simplement pas.Pourquoi un fichier batch fonctionnant avant ne fonctionne plus comme prévu sur certaines machines?

Que puis-je faire pour rendre la boucle efficace et pourquoi le lot a-t-il cessé de fonctionner (déplacement des fichiers vers le dossier) après avoir travaillé pendant plusieurs mois maintenant?

setlocal EnableDelayedExpansion 

for /F %%a in ('dir "C:\Program Files\WinSCP\Unconverted" /a-d /b') do (
    if not "%%~dpnxa"=="%~dpnx0" call :func "%%~a" 

:func 
set file=%~1 
set dir=%file:~0,49% 
mkdir "C:\Program Files\WinSCP\Unconverted\%dir%_fdc" 2>nul 

rem ECHO "%file%" 
rem ECHO "C:\Program Files\WinSCP\Unconverted\%dir%_fdc" 

move /Y "C:\Program Files\WinSCP\Unconverted\%file%" "C:\Program Files\WinSCP\Unconverted\%dir%_fdc" 
) 

start "" "C:\Program Files\WinSCP\hide_conversion_window.exe" 
+1

Quelle est l'erreur que vous voyez? Je peux déjà voir une parenthèse) manquante dans la boucle for au début. – oldabl

+0

Je n'ai vu aucune erreur après avoir enlevé @echo. S'il vous plaît dites-moi où le crochet manquant) est parce que je ne pouvais pas trouver où est manquant. Merci – great77

+0

Merci, je l'ai repéré et je vous ferai savoir maintenant si cela fonctionne .... pour/F %% a ('dir' C: \ Programmes \ WinSCP \ Unconverted "/ ad/b ') do ( sinon" %% ~ dpnxa "=="% ~ dpnx0 "call: func"% % ~ a ") – great77

Répondre

1

Je réécrit et a commenté le fichier batch, car il contient plusieurs questions où la plupart étaient pas un problème tant que ce fichier batch est stocké dans %ProgramFiles%\WinSCP\Unconverted et ce répertoire est aussi le répertoire en cours sur l'exécution du fichier batch que sur double-cliquez sur le fichier batch.

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 
set "SourceFolder=%ProgramFiles%\WinSCP\Unconverted" 

rem Process all files in source folder found by command DIR with ignoring 
rem subfolders and listed in bare format which means only file names with 
rem file extension but without file path. The batch file itself is skipped 
rem if being also stored in the source folder specified above. 

for /F "delims=" %%I in ('dir "%SourceFolder%\*" /A-D /B 2^>nul') do (
    if /I not "%SourceFolder%\%%I"=="%~f0" call :MoveFile "%SourceFolder%\%%I" 
) 

rem Execute converter through AutoIt in a separate command process and 
rem while conversion is running continue with batch processing which means 
rem restoring previous environment and finally exiting batch file processing. 

start "" "%ProgramFiles%\WinSCP\hide_conversion_window.exe" 
endlocal 
goto :EOF 

rem MoveFile is a subroutine which expects to be called with one argument 
rem being the name of the file to move with full file name which means 
rem with file path, file name and file extension. 

rem The first 49 characters of the file name define the name for target 
rem folder on which "_fdc" must be appended for completion. This folder 
rem is created without verification on success and then the file is 
rem moved into this folder again without verification on success. 

:MoveFile 
set "FileName=%~nx1" 
set "FolderName=%FileName:~0,49%_fdc" 
mkdir "%~dp1\%FolderName%" 2>nul 
move /Y "%~1" "%~dp1\%FolderName%\" >nul 
goto :EOF 

Ce fichier batch fonctionne pour le fichier batch étant stocké dans un autre dossier que le dossier source ou le répertoire en cours est un autre répertoire que le dossier contenant le fichier batch ou un fichier trouvé contient un espace ou tout autre caractère spécial comme &()[]{}^=;!'+,`~. Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez les commandes suivantes et lisez attentivement toutes les pages d'aide affichées pour chaque commande.

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • mkdir /?
  • move /?
  • set /?
  • setlocal /?
  • start /?

Lire aussi l'article Microsoft à propos Using Command Redirection Operators.

0

Merci pour la suggestion oldabi. Parfois, les choses fonctionnent et nous pensons que tout est parfait jusqu'à ce qu'il tombe en panne. Merci pour la suggestion. Je viens de réaliser mon erreur sur le support manquant.

SETLOCAL ENABLEDELAYEDEXPANSION 

for /F %%a in ('dir "C:\Program Files\WinSCP\Unconverted" /a-d /b') do (
    if not "%%~dpnxa"=="%~dpnx0" call :func "%%~a") 

goto conversion 

    :conversion 
rem ::execute converter through autoit 
start "" "C:\Program Files\WinSCP\hide_conversion_window.exe" 


:func 
set file=%~1 
set dir=%file:~0,49% 
mkdir "C:\Program Files\WinSCP\Unconverted\%dir%_fdc" 2>nul 

rem ECHO "%file%" 
rem ECHO "C:\Program Files\WinSCP\Unconverted\%dir%_fdc" 

MOVE /Y "C:\Program Files\WinSCP\Unconverted\%file%" "C:\Program Files\WinSCP\Unconverted\%dir%_fdc"