使用VBScript重命名文件,启动文件,等待,然后再次重命名

使用VBScript重命名文件,启动文件,等待,然后再次重命名,vbscript,Vbscript,我需要创建一个vbs脚本(出于维护目的),将foo.txt重命名为foo.bat并启动foo.bat,当foo.bat结束时,再次将foo.bat重命名为foo.txt 这是我的脚本vbs: On Error Resume next Dim Fso Set Fso = WScript.CreateObject("Scripting.FileSystemObject") Fso.MoveFile "foo.txt", "foo.bat" SCRIPT = "foo.bat" Set objShe

我需要创建一个vbs脚本(出于维护目的),将foo.txt重命名为foo.bat并启动foo.bat,当foo.bat结束时,再次将foo.bat重命名为foo.txt

这是我的脚本vbs:

On Error Resume next
Dim Fso
Set Fso = WScript.CreateObject("Scripting.FileSystemObject")
Fso.MoveFile "foo.txt", "foo.bat"

SCRIPT = "foo.bat"
Set objShell = CreateObject("Wscript.Shell")
strPath = Wscript.ScriptFullName
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(strPath)
strFolder = objFSO.GetParentFolderName(objFile) 

NewPath = objFSO.BuildPath(strFolder, SCRIPT)
set objshell = createobject("wscript.shell")
objshell.Run NewPath, vbHide, true

Fso.MoveFile "foo.bat", "foo.txt"

On Error GoTo 0
脚本执行得很好。将foo.txt重命名为foo.bat。启动foo.bat,但不希望foo.bat结束并将其重命名为foo.txt

我改变了这一行,什么也没发生:

objshell.Run NewPath, vbHide, 1, true
我需要什么,或者我做错了什么

替代解决方案(无VBScript):(根据@KenWhite的建议)

代码:

在foo.bat的末尾:

ren foo.bat foo.txt
exit

谢谢

这里有一个可能的解决方案,以防有人想知道如何解决这个问题而不诉诸上述替代方案

Dim Fso
Set Fso = WScript.CreateObject("Scripting.FileSystemObject")
Fso.MoveFile "foo.txt", "foo.bat"

SCRIPT = "foo.bat"
Set objShell = CreateObject("Wscript.Shell")
strPath = Wscript.ScriptFullName
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(strPath)
strFolder = objFSO.GetParentFolderName(objFile) 

NewPath = objFSO.BuildPath(strFolder, SCRIPT)
set objshell = createobject("wscript.shell")

objshell.Run "%COMSPEC% /c " & NewPath, 1, true

' Changes start here
'===================================================================

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

' Hold execution until cmd.exe process is done
do 
    ' Get cmd.exe processes
    Set colProcessList = objWMIService.ExecQuery _
    ("Select Name from Win32_Process WHERE Name LIKE 'cmd.exe'")
    WScript.Sleep 250
Loop while colProcessList.count > 0

Fso.MoveFile "foo.bat", "foo.txt"

到底为什么要使用VBScript?让批处理文件的最后一行将批处理文件重命名回.txt。由于批处理文件正在运行,因此无法执行此操作。foo.bat不能自己重命名。你错了。蝙蝠确实可以重新命名自己。它也可以删除自己。你试过了吗?是的。在foo的末尾使用命令ren foo.bat foo.txt。bat@KenWhite如你所愿。无论如何,我非常感谢你的替代方案。它起作用了。无意冒犯,但我认为在批处理文件的末尾添加一行,以便它自己重命名要容易得多。:-)是的,我同意。我从来没有说过在批处理文件的末尾添加一行不是“更简单的解决方案”。这个问题被标记为“vbscript”,标题为“使用vbscript重命名文件…”,因此出于一致性的考虑,有一个vbscript解决方案是很自然的。我同意,这就是为什么我拒绝了海报建议我将我的解决方案作为答案发布的原因-它不是vbscript。顺便说一句,我不得不说,虽然我建议的更改确保只有在所有cmd.exe进程终止后才能继续执行,但海报上显示的初始代码在我的个人计算机上进行测试期间,在将其重命名回.txt之前,确实等待了一个虚拟bat脚本的结束。您将看到它的一般形式为“objShell.Run”(strCommand,[IntWindowsStyle],[bWaitOnReturn]),因此显示该窗口是因为我在测试时将参数“IntWindowsStyle”设置为1,而不是因为“%COMSPEC%/c”构造,它所做的只是执行一个命令并终止shell(与%COMSPEC%/k一样,这不会在命令后终止shell)。因此,如果不希望窗口显示,只需使用objshell。运行“%COMSPEC%/c”&NewPath,0,true。
Dim Fso
Set Fso = WScript.CreateObject("Scripting.FileSystemObject")
Fso.MoveFile "foo.txt", "foo.bat"

SCRIPT = "foo.bat"
Set objShell = CreateObject("Wscript.Shell")
strPath = Wscript.ScriptFullName
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(strPath)
strFolder = objFSO.GetParentFolderName(objFile) 

NewPath = objFSO.BuildPath(strFolder, SCRIPT)
set objshell = createobject("wscript.shell")

objshell.Run "%COMSPEC% /c " & NewPath, 1, true

' Changes start here
'===================================================================

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

' Hold execution until cmd.exe process is done
do 
    ' Get cmd.exe processes
    Set colProcessList = objWMIService.ExecQuery _
    ("Select Name from Win32_Process WHERE Name LIKE 'cmd.exe'")
    WScript.Sleep 250
Loop while colProcessList.count > 0

Fso.MoveFile "foo.bat", "foo.txt"