File checking on Windows Startup is failing [duplicate]

眉间皱痕 提交于 2021-01-19 09:01:24

问题


I have this script that allows me to automatically backup my MySQL Database every 5 minutes using a batch file.

Dim WshShell
Dim FSO
Dim stopBackup

stopBackup = false

' Register on Windows Startup if not registered when this file is opened.
RegisterOnWindowsStartUp()

' Keep backing up the database every 5 minutes, loop will do.
Do While True 
    Set FSO = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists("auto_backup.bat") Then ' Check if bat file for backing up the database exist.
        MsgBox "Backup Message Test."
        ' Run the batch file which handle the auto backup of database, keep it invisible.
        Set WshShell = CreateObject("WScript.Shell") 
        WshShell.Run chr(34) & "auto_backup.bat" & Chr(34), 0 
        Set WshShell = Nothing
        WScript.Sleep 300000 ' Delay loop every 5 minutes.
    Else ' Stop the loop and do not proceed anymore when the bat file is not exist.
        WScript.Echo "Failed to auto backup the database, this won't continue anymore."
        stopBackup = true
        RemoveFromRegistry() ' Unregister this file on Windows Startup since the bat file is no longer exist.
    End If
    
    If stopBackup Then ' Break the loop when stopBackup become true
        Exit Do ' Break the loop here.
    End If
Loop

' Remove this script from registry on Windows Startup
Function RemoveFromRegistry()
    Set objShell = Wscript.CreateObject("Wscript.Shell")
    objShell.RegDelete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\autobackup_key"
End Function

' Register this script on Windows Startup only if not registered.
Function RegisterOnWindowsStartUp()
    If IsRegistryExist = False Then
        Set WshShell = CreateObject("WScript.Shell")
        keyNameLocation = "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\autobackup_key"
        valueFileLocation = WScript.ScriptFullName
        keyType = "REG_SZ"
        WshShell.RegWrite keyNameLocation, valueFileLocation, keyType
        Set WshShell = Nothing
    End If
End Function

' Check if Registry Key Exist on Windows Startup.
Function IsRegistryExist()
    Dim sKey, bFound
    skey = "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\autobackup_key"

    with CreateObject("WScript.Shell")
      on error resume next            ' turn off error trapping
        sValue = .regread(sKey)       ' read attempt
        bFound = (err.number = 0)     ' test for success
      on error goto 0                 ' restore error trapping
    end with
    
    If bFound Then
      IsRegistryExist = True
    Else
      IsRegistryExist = False
    End If
End Function

The filename of the batch file that allows me to back up the database is auto_backup.bat and it's working fine and no problem, it's on the same directory where the script above is located.

The problem is every time the Windows Startup, it fails to check for the existence of auto_backup.bat, but when I open the script and run it, its working fine and no issue.

There might be some issue with my logic, can anybody help me fix it?


回答1:


The problem is because when you register your script on Windows Startup through the registry, the script will be executed from the directory of Windows Startup when windows started.

In order to get the original working directory where you can look for the auto_backup.bat, you can combine the FileSystemObject and WScript.ScriptFullName functions to get the parent directory of the current script.

CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) & "\auto_backup.bat"

Then the IF-ELSE condition inside your loop would be

...
Do While True 
Set FSO = CreateObject("Scripting.FileSystemObject")
 
' (1) Add this code.
autobackup_bat_file = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) & "\auto_backup.bat"

If fso.FileExists(autobackup_bat_file) Then ' (2) Change this line.
    MsgBox "Backup Message Test."
    Set WshShell = CreateObject("WScript.Shell") 
    WshShell.Run chr(34) & autobackup_bat_file  & Chr(34), 0 ' (3) Change this line.

' Continue some of your code here...
...



回答2:


it's on the same directory where the script above is located

This is not where a relative path looks. It starts from the working directory.

The working directory of a shortcut is not necessarily the directory containing the shortcut. You should edit the shortcut properties and set the working directory you want, instead of using the default (which is often C:\Windows or C:\Users\%USERNAME%)

Or you can put an absolute path in the script, or have the script change working directory to its own directory, or have the script combine its directory and the filename to dynamically create an absolute path.



来源:https://stackoverflow.com/questions/65462310/file-checking-on-windows-startup-is-failing

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!