webForumDet fria alternativet

Får ej små bokstäver med hjälp av VBScript?

ASP

10 svar · 410 visningar · startad av Dr-man

Medlem sedan juli 2002732 inlägg
Frågan#1

Jag problem med följande kod.
Med denna kod försöker jag ta en "rename" på en viss mapp och dess undermappar, så att filnamnet får småa bokstäver.

Men jag får följande felmeddelande:
Objekt krävs.: 'Server'

Är det nån som kan hjälpa?

Set objFS = Server.CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFS.GetFolder(strDir) 

For Each File In objFolder.Files 
  'Byt namn 
   strNewFileName = LCase(File.Name) 
   objFS.MoveFile File.Name, strNewFileName 
Next 

Set objFile = Nothing 
Set objFolder = Nothing 
Set objFS = Nothing
Medlem sedan dec. 20003 887 inlägg
#2

Du kan inte flytta en fil till samma plats med MoveFile.

Försök med egenskapen Name istället...

'[blue]i loopen[/blue]
File.Name = strNewFileName
Medlem sedan juni 200032 967 inlägg
#3

Om det är VBScript utan asp, så ska du droppa Server.

Medlem sedan juli 2002732 inlägg
#4

Jag får fortfarande felmeddelanden!

Felmeddelandet är: Filen finns redan!

strDir = "d:\test2" 
Set objFS = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFS.GetFolder(strDir) 

For Each File In objFolder.Files 
   strNewFileName = LCase(File.Name) 
   File.Name = strNewFileName
   objFS.MoveFile File.Name, strNewFileName 
Next 

Set objFile = Nothing 
Set objFolder = Nothing 
Set objFS = Nothing
Medlem sedan mars 20015 287 inlägg
#5

Du gör ju samma sak!?!

Testa att ta bort raden:

objFS.MoveFile File.Name, strNewFileName

Annars tror jag du kanske får lov att temporärt döpa/kopiera filerna till ett annat namn o sen tillbaka till det rätta namnet.

Medlem sedan juli 2002732 inlägg
#6

Det hjälpte inte att ta bort raden
objFS.MoveFile File.Name, strNewFileName

Kan nån visa hur man gör eventuellt temporärt döper/kopierar filerna till ett annat namn o sen tillbaka till det rätta namnet?

Medlem sedan jan. 20032 285 inlägg
#7

Du kanske skulle kunna göra så här?

strDir = "d:\test2" 
Set objFS = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFS.GetFolder(strDir) 

For Each File In objFolder.Files 
   objFS.CopyFile "d:\test2\" & File.Name, "d:\test2\" & LCase(File.Name), True
Next 

Set objFile = Nothing 
Set objFolder = Nothing 
Set objFS = Nothing

Yeah! 1000 inlägg! :e

Medlem sedan jan. 20032 285 inlägg
#8

Hörde av Solis att min förra kod inte funkar, så jag försöker igen, hoppas att det inte blir samma fel som du har fått innan. :)

strDir = "d:\test2" 
Set objFS = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFS.GetFolder(strDir) 

For Each File In objFolder.Files
   Set objFile = objFS.GetFile("d:\test2\" & File.Name)
   objFile.Name = LCase(File.Name)
Next
Set objFile = Nothing

Set objFile = Nothing 
Set objFolder = Nothing 
Set objFS = Nothing
Medlem sedan juli 2002732 inlägg
#9

Jag får det inte ännu heller att fungera!
Felmeddelandet är: Filen finns redan.
Det är på rad 7, som den klagar på.

Medlem sedan dec. 20003 887 inlägg
#10

skumt...

MSDN skrev:

Name Property
Sets or returns the name of a specified file or folder. Read/write.

object.Name [= newname]

Arguments
object
Required. Always the name of a File or Folder object.
newname
Optional. If provided, newname is the new name of the specified object.

strDir = "d:\test2"

Set fsoFile = CreateObject("Scripting.FileSystemObject")
Set fsoDir = fsoFile.GetFolder(strDir)

For Each objFile In fsoDir.Files
  objFile.Name = LCase(objFile.Name)
Next

Set fsoFile = Nothing
Set fsoDir = Nothing

Det borde ju faktiskt fungera. En annan metod är att först kopiera filen och sätta ett nytt namn på den typ LCase(File.Name) & ".new". Sedan tar man bort orginalet med Delete. Sedan kopierar du kopian och sätter namnet till Left(File.Name, Len(File.Name) - 4). Sedan tar man bort första kopian.

Medlem sedan juni 20022 599 inlägg
#11

Ett förslag på lösning enligt Engine^s och solbulles modell:

TemporaryFolder=2

Sub MakeLCase(fld)
	Set objFolder= objFS.GetFolder(fld)
	For Each File In objFolder.Files
		lCaseName=LCase(File.Name)
		if File.Name<> lCaseName then
			tmpName=objFS.GetTempName()
			objFS.CopyFile File.Path, fldTemp & "\" & tmpName, true
			objFS.DeleteFile File, true
			objFS.MoveFile  fldTemp & "\" & tmpName, objFolder.Path & "\" & lCaseName
		end if
	Next
	For Each subFld in objFolder.SubFolders
		MakeLCase subFld.Path
	next
end sub

Set objFS = CreateObject("Scripting.FileSystemObject") 
Set fldTemp= objFS.GetSpecialFolder(TemporaryFolder)
MakeLCase "."

Används på egen risk och kan förmodligen behöva justeringar.

259 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)