2017-07-17 9 views
1

Ce script (en plus de la recherche de fichiers en double) renomme les fichiers pour ne pas inclure de caractères spéciaux (dans un seul dossier). J'ai toujours des problèmes quand le nom de fichier a des caractères comme et . J'ai essayé d'ajouter cela dans le delayedexpansion et aussi à l'extérieur sans succès.batch: échappement de caractères spéciaux comme "et" dans une variable

@echo off 
echo "%~1" | find /i "system volume information" >nul && exit /b 
echo "%~1" | find /i "s-1-5-21-3" >nul && exit /b 
echo "%~1" | find /i "recycle" >nul && exit /b 
cd /d %1 2>nul 
if /i not "%~1"=="%cd%" echo cannot access %~n1 && exit /b 

for %%v in (*) do set "original=%%~nxv" & call :validate 
for /f "delims=" %%v in ('dir /b /a-d') do set "compare=%cd%\%%v" & call :detection 
exit /b 

:validate 
:: add handling of “ and ” 
set "newtitle=%original:!=%" 
set "newtitle=%newtitle:”=%" 
set "newtitle=%newtitle:&=and%" 
setlocal enabledelayedexpansion 
set "newtitle=!newtitle:%%= percent!" 
setlocal disabledelayedexpansion 
if not "%original%"=="%newtitle%" ren "%original%" "%newtitle%" && echo validated %newtitle% 
goto next 

:detection 
:: this extrapolates %string% from beginning of filename 
call d:\other\scripts\lootname.cmd "%compare%" data 
set count=0 
for %%v in ("%string%*") do set /a "count+=1" 
for %%v in ("%string%*") do if not "%count%"=="1" echo "%%v" 
:next 
+0

Un nom de fichier ne peut pas avoir de caractères comme ** "** et **" ** – Compo

+0

Eh bien youtube downloader enregistre avec succès ces noms de fichiers sur mon disque NTFS. et maintenant que j'ai essayé je peux aussi. Je pense que c'est juste le droit '' '' qui sont illégaux – bricktop

+0

@Compo Pourquoi est-ce que vous pensez ainsi? Je viens de mettre votre phrase exacte dans un nom de fichier, mais le batch n'est pas l'environnement idéal pour gérer ces caractères. – LotPings

Répondre

1

Ce PowerShell one liner doit rechercher de façon récurrente les fichiers (du dossier actuel) avec des guillemets typographiques et les supprimer.

$Search = '“|”';gci -r -file |where Name -Match $Search|Ren -NewName {$_.Name -replace $Search} -Confirm 

Il suffit de coller dans une console PowerShell et laissez-la s'exécuter. Le paramètre -Confirm vous permettra de demander chaque renomme

Exemple de sortie:

Confirm 
Are you sure you want to perform this action? 
Performing the operation "Rename File" on target 
"Item: A:\A file name cannot have characters like “ and ” 
Destination: A:\A file name cannot have characters like and ". 
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): 

Normalement je Noyez le code Powershell comme ceci:

powershell -NoP -Command "$Search = '“|”';gci -r -file |where Name -Match $Search|Ren -NewName {$_.Name -replace $Search}" 

Mais gardez à l'esprit Cette PowerShell utilise normalement UTF16 comme Windows lui-même en interne, donc ici les limites de pages de codes s'appliquent.
Je ne pouvais pas coller cela dans ma console basée sur chcp 850 - les citations typographiques ont été remplacées par des citations normales.

+0

de passer à PowerShell, puis-je le faire de façon incrémentielle en exécutant une ligne de PowerShell à partir d'un script de lot régulier ou dois-je réécrire le tout? Que faire si un script appelle un autre script, puis-je appeler des scripts PowerShell de réguler ar scripts batch et vice versa? – bricktop

+0

Je vais intégrer la ligne ci-dessus dans un lot. En général, les commandes de mixage requièrent des guillemets/échappements pour ne pas laisser le shell interpréter les commandes destinées à l'autre. – LotPings

+0

pouvez-vous élaborer sur le UTF/CHCP et les limites de pages? – bricktop