2017-05-25 4 views
1

Je travaille sur un script pour automatiser quelques tâches. Essentiellement, il ne fait que renommer les fichiers s'ils existent. Cependant, ces fichiers sont essentiels au fonctionnement de certains autres logiciels. Si le changement de nom d'un fichier échoue, ou s'il ne trouve pas le fichier, je voudrais qu'il dise quel fichier il était. Cependant, la commande REN n'est pas très descriptive en cas d'échec. Je sais que si cela échoue, il soulève ERRORLEVEL à 1. Y at-il d'autres informations que je peux obtenir de l'échec, comme le nom de fichier? Ou est-ce à peu près juste un succès ou un échec?Traitement des erreurs dans les fichiers batch

Les machines sur lesquelles il fonctionnera sont Windows 7 et plus, donc PowerShell est également une option si nécessaire, mais je préfère batch.

Merci

+2

Il réussit ou échoue. Aucune information disponible sur le fichier qui a causé l'échec. –

+0

Tout ce dont vous avez besoin est d'ajouter une commande d'exécution conditionnelle après que le ren fasse écho au fichier qui tente de le renommer. 'Ren filea.txt fichierb.txt || Echo Ren filea.txt fileb.txt failed' – LotPings

+1

Je suis éberlué par tout sur cette page. Il me semble que vous avez déjà capturé le nom du fichier comme variable itérative, n'est-ce pas? Je veux dire, si vous parcourez des fichiers pour effectuer des renommages en utilisant quelque chose comme 'pour %% I (*) faire ren" %% ~ fI "" %% ~ nI.bak "' ou similaire, non? Pourquoi ne pas juste '... faire (ren" %% ~ fI "" %% ~ nI.bak "|| echo Renommer %% ~ nxI a échoué)' ou similaire? Peut-être lié, vous pourriez trouver [prename.bat] (https://stackoverflow.com/a/38191137/1683264) utile pour les renames par lots. – rojo

Répondre

3

Comme Ken White souligne dans un commentaire sur la question, les messages d'erreur émis par cmd.exe commande de ren do pas comprennent le nom du fichier (s) impliqué.

PowerShell, en revanche, fournit des messages d'erreur détaillés qui ne pas incluent les noms de fichiers.
Prenez l'exemple de script suivant:

# Create helper sample files. 
$tempFiles = "$env:TEMP\foo", "$env:TEMP\bar" 
$null = New-Item -Type File $tempFiles 

# Try to rename a nonexistent item. 
Rename-Item \no\such -NewName foo 

# Try to rename to a file that already exists. 
Rename-Item $env:TEMP\foo -NewName bar 

# Clean up the sample files. 
Remove-Item $tempFiles 

Si vous enregistrez ci-dessus dans un fichier *.ps1 et l'exécuter (en supposant que vous avez permitted scripts to run), vous verrez la sortie d'erreur suivant:

Rename-Item : Cannot rename because item at '\no\such' does not exist. 
At C:\Users\jdoe\Desktop\pg\pg.ps1:8 char:5 
+  Rename-Item \no\such -NewName foo 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException 
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand 

Rename-Item : Cannot create a file when that file already exists. 
At C:\Users\jdoe\Desktop\pg\pg.ps1:11 char:5 
+  Rename-Item $env:TEMP\foo -NewName bar 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : WriteError: (C:\Users\jdoe\AppData\Local\Temp\foo:String) [Rename-Item], IOException 
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand 

Alors que la sortie est verbeuse, elle contient toutes les informations pertinentes, et vous pouvez même l'inspecter par programmation, via la variable automatique $Error, qui contient toutes les erreurs qui ont été rapportées dans la session en reverse chrono ordre logique ($Error[0] contient le plus erreur récente).

Non que, par défaut, le script PowerShell continuera à exécuter lorsque ces erreurs se produisent, parce qu'ils sont considérés comme non terminaison.

  • La façon la plus simple pour que le script abort tout de suite est de commencer votre script avec la ligne $ErrorActionPreference= 'Stop'. Vous pouvez également utiliser -ErrorAction Stop sur une base par commande.

Run Get-Help about_Preference_Variables et Get-Help about_CommonParameters pour en savoir plus.

0

comme déjà noté, ren en utilisant des caractères génériques ne pas vous dire quel fichier a échoué. Vous devez donc traiter chaque fichier individuellement. Heureusement, il existe des commandes pour le faire: for et forfiles.

for %%a in (*) do ren "%%a" "destination.ext" 2>nul || echo FAILED: %%a 

cette tente de renommer chaque fichier « destination.ext », qui fonctionne très bien pour la première d'entre eux.
Renommer le reste des fichiers échouera (destination déjà existante).
|| est un "si la commande précédente a échoué, alors" opérateur.
2>nul supprime le errormessage (inutile pour vous, car il ne vous dit pas le nom du fichier)

(Note: Ceci est la syntaxe pour batchfiles Si vous essayez directement sur la ligne de commande,
se relaient %%a avec %a.