2016-09-16 10 views
1

Ich habe kein Problem beim Voranstellen von Zeichen oder Zeichenfolgen an einen Dateinamen mit der Replace-Funktion, z.VBScript - Umbenennen von Dateien mit Replace-Funktion und getbasename-Methode

j = prependstring 
for each i in folder.files  
k = len(i.name) 
i.name = replace(i.name, i.name, j & left(i.name, k)) 

Auch nicht anhängig z.B.

j = appendstring 
for each i in folder.files 
ext = fso.getextensionname(i) 
k = instrrev(i.name,".")-1 
i.name = replace(i.name, i.name, left(i.name, k) & " " & j & "." & ext) 

jedoch den folgenden Code verwenden, wenn ich die gesamten base name versuchen zu ersetzen, mit einer Version, in den führenden Buchstaben jeden Wort groß geschrieben wird, erhalte ich eine „Datei bereits vorhanden“ Fehler.

option explicit 
dim fso, folder, wshell, strpath, strname, i, abspath, base, ext, capstr 

set fso = createobject("scripting.filesystemobject") 
set folder = fso.getfolder(".") 

set wshell = createobject("wscript.shell") 
strpath = wscript.scriptfullname 
strname = fso.getfilename(strpath) 

function wordcaps(strinput) 
dim x 
for x = asc("a") to asc("z") 
strinput = replace(strinput, " " & chr(x), " " & ucase(chr(x))) 
next 
wordcaps = ucase(left(strinput, 1)) & mid(strinput, 2) 
end function 

for each i in folder.files 
if i.name <> strname then 
base=fso.getbasename(i) 
capstr = wordcaps(base) 
'wscript.echo capstr 
i.name = replace(i.name, base, capstr) 
end if 
next 
wscript.echo "Done!" 

ich das gleiche Ziel MoveFile Methode erreichen kann, wie unten dargestellt:

for each i in folder.files 
if i.name <> strname then 
abspath=fso.getabsolutepathname(i) 
base=fso.getbasename(i) 
ext=fso.getextensionname(i) 
capstr = wordcaps(base) 
fso.movefile abspath, folder & "\" & capstr & "." & ext 
end if 
next 
wscript.echo "Done!" 

Ich kann nicht verstehen, warum die replace Version nicht funktioniert?

Antwort

0

Die grundlegende Tatsache: Windows-Dateisystem Groß- und Kleinschreibung ist (es sei denn, rekonfiguriert) (vgl here)

nicht Groß- und Kleinschreibung übernehmen Sie. Betrachten Sie zum Beispiel die Namen OSCAR, Oscar und Oscar als identisch, obwohl einige Dateisysteme (z. B. als POSIX-kompatibles Dateisystem) sie als unterschiedlich betrachten können. Hinweis , dass NTFS POSIX-Semantik für Groß-/Kleinschreibung unterstützt, aber das ist nicht das Standardverhalten. Weitere Informationen finden Sie unter CreateFile.

Der Code mit dieser Tatsache in den Griff zu kommen, benötigt und zu erkennen, dass .MoveFile (Kopie beinhalten könnte) weniger strenge dann .Name Umbenennung (Namensänderung und sonst nichts):

Option Explicit 

Const csFiNa = "a.txt" 

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject") 
If goFS.FileExists(csFiNa) Then goFS.DeleteFile csFiNa 
goFS.CreateTextFile csFiNa 
WScript.Echo "Size of", csFiNa, ":", goFS.GetFile(csFiNa).Size 
goFS.MoveFile csFiNa, UCase(csFiNa) 
WScript.Echo "Moved", csFiNa, "to", UCase(csFiNa) 
On Error Resume Next 
goFS.GetFile(csFiNa).Name = UCase(csFiNa) 
WScript.Echo "*** Error:", Err.Description 
On Error GoTo 0 

Ausgabe:

cscript 39537824.vbs 
Size of a.txt : 0 
Moved a.txt to A.TXT 
*** Error: File already exists 
+0

Das klärt das auf, danke Ekkehard :) –