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.
Run Get-Help about_Preference_Variables
et Get-Help about_CommonParameters
pour en savoir plus.
Il réussit ou échoue. Aucune information disponible sur le fichier qui a causé l'échec. –
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
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