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

rename a file using VBScript, launch file, wait, and rename again

我需要创建一个 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 的建议)

代码:

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, true

On Error GoTo 0

并且在 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"