VBScript - 使用replace函数和getbasename方法重命名文件

时间:2016-09-16 18:20:31

标签: string replace vbscript character

使用Replace功能将字符或字符串添加到文件名时,我没有任何问题,例如

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

也不代表那个问题。

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)

但是,使用下面的代码,如果我尝试将每个单词的前导字母大写的版本替换整个base name,我会得到一个"文件已经存在"错误。

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!"

我可以使用MoveFile方法实现相同的目标,如下所示:

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!"

我无法理解为什么replace版本不起作用?

1 个答案:

答案 0 :(得分:0)

基本事实:Windows文件系统不区分大小写(除非重新配置)(参见here

  

不要假设区分大小写。例如,考虑名称OSCAR,   奥斯卡和奥斯卡是一样的,即使是一些文件系统(例如   作为符合POSIX的文件系统)可能会将它们视为不同的。注意   NTFS支持POSIX语义以区分大小写,但这是   不是默认行为。有关更多信息,请参阅CreateFile。

需要处理这个事实以实现.MoveFile(可能涉及复制)的代码不那么严格.Name重命名(名称更改,没有别的):

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

输出:

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