AnonymousX

Run/ShellExecute windows folder locations

6 posts in this topic

Hello,

What command would I use to open the following folder directories for:

Computer/This PC (windows 7/Windows 10)

Libraries\documents

Libraries\Pictures

I know:

 Run("Explorer.exe " & $filepath)
 ShellExecute($filepath)

can be used to open folder locations when you type in the full directory such as "C:\Users\%username%\Documents" but I'm trying to figure out how to use these windows short paths. 

Thanks,

Share this post


Link to post
Share on other sites



21 hours ago, Subz said:

Sorry pushed submit by accident, I meant to say

Do you mean macros like @DocumentsDir or did you want special folders like:

_WinAPI_ShellGetSpecialFolderPath 

https://msdn.microsoft.com/en-us/library/windows/desktop/bb762494(v=vs.85).aspx

Referring to things like @DocumentsDir (Which gives me an error of undefined macro. Guessing I'm missing an #include?)

 

See right now, before a user is allowed to save an address I use:

FileExists($inputaddress)

to check if the path exists, but in this case if $inputaddress was to be "Libraries\Pictures" this would return 0 (Path/file does not exist). However if I go into windows explore and type "Libraries\Pictures" (or just "Pictures" for that matter) it takes me to C:\Users\(username)\Pictures and will not display the full path it just shows "Libraries\Documents".

So I'm trying to find out if there is a way that if the user enters in one of these shorten versions of the file path such as "Libraries\Pictures" the code will be able to recognize this as a true path and will be able to open that file location.

With further testing I've discovered that both:

ShellExecute("Libraries\Pictures")
Run('Explorer.exe ' & "Libraries\Pictures")

Don't work either, so I'm starting to think this might be a complicated thing to do for me....

Share this post


Link to post
Share on other sites

Sorry, @DocumentsDir should have been - @MyDocumentsDir

Libraries are ultimately shortcut files with the extension .library-ms files and can be located in @AppDataDir & '\Microsoft\Windows\Libraries.

You can use something like the following and it will open to that location

ShellExecute('Explorer.exe', @AppDataDir & '\Microsoft\Windows\Libraries\Pictures.library-Ms')

The file itself is actually xml, if you use a parser you can grab the <simplelocation>><url>knownfolder:{Guid} you can view a list of Guids and there locations here:

https://msdn.microsoft.com/en-us/library/bb882665(v=vs.110).aspx

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

I created a function to do something similar a while ago. You may be able to adapt for your needs.

#include <WinAPIShellEx.au3>
#include <WinAPI.au3>

Local $s_FilePath = _Win7_GetKnownFolder('PicturesLibrary')

if @error Then
    MsgBox(0,'DOH!', $s_FilePath)
Else
    MsgBox(0,'Yay Found', 'Path: '& $s_FilePath & @crlf & 'File Exists: ' & FileExists($s_FilePath))
EndIf


; #FUNCTION# ====================================================================================================================
; Name ..........: _Win7_GetKnownFolder
; Description ...: Retrieves the full path of a known folder
; Syntax ........: _Win7_GetKnownFolder($s_Folder)
; Parameters ....: $s_Folder  - A string value denoting the known folder
; Return values .: Success - Returns the full folder path
;                  Failure - Sets @error to 1 and returns a string for logging
; Remarks .......: Only for Windows Vista and above
; Related .......: _XP_GetSpecialFolder (for XP and lower)
; Link ..........: link http://msdn.microsoft.com/en-us/library/dd378457.aspx
; Example .......: _Win7_GetKnownFolder('CommonPrograms')
; ===============================================================================================================================
Func _Win7_GetKnownFolder($s_Folder)
    ; trimmed list of KnownFolder constants
    Local $s_Constants = 'CommonPrograms|' & _ ;%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs
            'CommonStartMenu|' & _ ; %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu
            'CommonStartup|' & _ ; %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\StartUp
            'CommonTemplates|' & _ ; %ALLUSERSPROFILE%\Microsoft\Windows\Templates
            'Desktop|' & _ ; %USERPROFILE%\Desktop
            'Documents|' & _ ; %USERPROFILE%\Documents
            'DocumentsLibrary|' & _ ; %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms
            'Favorites|' & _ ; %USERPROFILE%\Favorites
            'Fonts|' & _ ; %windir%\Fonts
            'Libraries|' & _ ; %APPDATA%\Microsoft\Windows\Libraries
            'LocalAppData|' & _ ; %LOCALAPPDATA% (%USERPROFILE%\AppData\Local)
            'LocalAppDataLow|' & _ ; %USERPROFILE%\AppData\LocalLow
            'Music|' & _ ; %USERPROFILE%\Music
            'MusicLibrary|' & _ ; %APPDATA%\Microsoft\Windows\Libraries\Music.library-ms
            'PhotoAlbums|' & _ ; %USERPROFILE%\Pictures\Slide Shows
            'PicturesLibrary|' & _ ; %APPDATA%\Microsoft\Windows\Libraries\Pictures.library-ms
            'Pictures|' & _ ; %USERPROFILE%\Pictures
            'Playlists|' & _ ; %USERPROFILE%\Music\Playlists
            'Profile|' & _ ; %USERPROFILE% (%SystemDrive%\Users\%USERNAME%)
            'ProgramData|' & _ ; %ALLUSERSPROFILE% (%ProgramData%, %SystemDrive%\ProgramData)
            'ProgramFiles|' & _ ; %ProgramFiles% (%SystemDrive%\Program Files)
            'ProgramFilesX64|' & _ ; %ProgramFiles% (%SystemDrive%\Program Files)
            'ProgramFilesX86|' & _ ; %ProgramFiles% (%SystemDrive%\Program Files)
            'ProgramFilesCommon|' & _ ; %ProgramFiles%\Common Files
            'ProgramFilesCommonX64|' & _ ; %ProgramFiles%\Common Files
            'ProgramFilesCommonX86|' & _ ; %ProgramFiles%\Common Files
            'Programs|' & _ ; %APPDATA%\Microsoft\Windows\Start Menu\Programs
            'Public|' & _ ; %PUBLIC% (%SystemDrive%\Users\Public)
            'PublicDesktop|' & _ ; %PUBLIC%\Desktop
            'PublicDocuments|' & _ ; %PUBLIC%\Documents
            'PublicLibraries|' & _ ; %ALLUSERSPROFILE%\Microsoft\Windows\Libraries
            'PublicMusic|' & _ ; %PUBLIC%\Music
            'PublicPictures|' & _ ; %PUBLIC%\Pictures
            'PublicVideos|' & _ ; %PUBLIC%\Videos
            'QuickLaunch|' & _ ; %APPDATA%\Microsoft\Internet Explorer\Quick Launch
            'ResourceDir|' & _ ; %windir%\Resources
            'RoamingAppData|' & _ ; %APPDATA% (%USERPROFILE%\AppData\Roaming)
            'SendTo|' & _ ; %APPDATA%\Microsoft\Windows\SendTo
            'StartMenu|' & _ ; %APPDATA%\Microsoft\Windows\Start Menu
            'Startup|' & _ ; %APPDATA%\Microsoft\Windows\Start Menu\Programs\StartUp
            'System|' & _ ; %windir%\system32
            'SystemX86|' & _ ; %windir%\system32
            'Templates|' & _ ; %APPDATA%\Microsoft\Windows\Templates
            'UserPinned|' & _ ; %APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned
            'UserProfiles|' & _ ; %SystemDrive%\Users
            'UserProgramFiles|' & _ ; %LOCALAPPDATA%\Programs
            'UserProgramFilesCommon|' & _ ; %LOCALAPPDATA%\Programs\Common
            'Videos|' & _ ; %USERPROFILE%\Videos
            'VideosLibrary|' & _ ; %APPDATA%\Microsoft\Windows\Libraries\Videos.library-ms
            'Windows' ; %windir%

    ; check the passed folder name is listed
    If Not _String_SearchForWords($s_Constants, $s_Folder) Then Return SetError(1, 0, '"' & $s_Folder & '" ' & ' is not listed in the Known Folder list')

    ; return the value of the variable
    Local $s_GUID = Eval('FOLDERID_' & $s_Folder)

    ; get the known folder path
    Local $s_FolderPath = _WinAPI_ShellGetKnownFolderPath($s_GUID)
    If @error Then Return SetError(@error, @extended, _WinAPI_GetLastErrorMessage())
    Return $s_FolderPath
EndFunc   ;==>_Win7_GetKnownFolder

; #FUNCTION# ====================================================================================================================
; Name ..........: _String_SearchForWords
; Description ...: Search for the existance of multiple words in a given string
; Syntax ........: _String_SearchForWords($sCallingFunc, $sTest, $sSearch)
; Parameters ....: $sTest        - The string to run the check against
;                  $sSearch      - The string(s) to search for
; Return values .: Success - Returns 0 - No Match
;                                    1 - Match
;                  Failure - Sets @error to 1 and logs an error message
; Example .......: MsgBox(0,'', _String_SearchForWords('', 'batcave1,batcave2,xbmc,benneraswell', 'batcave'))
; ===============================================================================================================================
Func _String_SearchForWords($sTest, $sSearch)
    Local $sRunningFunc = '_String_SearchForWords'
    Local $sPattern = '(?i)^(?=.*\b' & StringReplace($sSearch, '|', '\b)(?=.*\b') & '\b)'
    Local $iRet = StringRegExp($sTest, $sPattern)

    If @error Then Return SetError(@error, @extended, '')
    Return $iRet
EndFunc   ;==>_String_SearchForWords

Or probably better for you

Local $s_FileName = FileSelectFolder('Please Select The Folder...', '', 3, "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}")

If Not @error Then
    ; get the folder name of any special folders
    If StringInStr($s_FileName, '::{') Then
        $s_DisplayName = SpecialFolders_GetSelfName($s_FileName)
        $s_FileName = SpecialFolder_ReturnPath($s_FileName)
    EndIf

    MsgBox(0,'', $s_FileName)
    ; check fileexists
EndIf

Func SpecialFolder_ReturnPath($s_Path)
    Local $s_Lnk = @TempDir & '\FileName.lnk'

    ; creste a shortcut for the path
    If Not FileCreateShortcut($s_Path, $s_Lnk) Then Return $s_Path

    ; read the shortcuts property to an array
    Local $a_Shortcut = FileGetShortcut($s_Lnk)
    If @error Then Return $s_Path
    FileDelete($s_Lnk)

    ; get the shortcut target path
    If IsArray($a_Shortcut) Then Return $a_Shortcut[0]
    Return $s_Path
EndFunc   ;==>SpecialFolder_ReturnPath

Func SpecialFolders_GetSelfName($s_Path)
    Local $objShell = ObjCreate("Shell.Application")
    If Not IsObj($objShell) Then Return ''

    Return $objShell.NameSpace($s_Path).Self.Name
EndFunc   ;==>SpecialFolders_GetSelfName

 

Edited by benners
1 person likes this

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • BlazerV60
      By BlazerV60
      Hello all,
      I've been trying to figure out how to launch Google Chrome in the background (hidden) but it doesn't seem possible. I've tried the following methods:
      ShellExecute("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", "", "", "", @SW_HIDE) Also I've tried:
      ShellExecute(@ComSpec, "/c start chrome.exe","","",@SW_HIDE) Lastly I tried:
      RunWait('"'&@ProgramFilesDir&'\Google\Chrome\Application\chrome.exe" --silent-launch',@ScriptDir)  
      But all of them launch my chrome browser without hiding it. Does anyone know a workaround for this or if AutoIT just can't Chrome? 
      Bonus points if you know how to make it launch chrome hidden and make it go to https://www.autoitscript.com
       
      Thank you,
      Brian
    • Miloud
      By Miloud
      How to get the result of the command?
      My code :
      Local $iRc = ShellExecute ( "G:\ffmpeg\bin\ffmpeg.exe" , "-version" , "G:\ffmpeg\bin\") ProcessWaitClose($iRc) $Message = StdoutRead($iRc)
    • breakbadsp
      By breakbadsp
      I want to run a python script from autoit. 
      I know we can do this with shellexecute or run , but this python script takes 3 cmd line arguments.
      How to pass them from autoit script?
      I tried many ways.
      Following solution also not working 
      e.g. 
      RunWait( 'fullpath\Python.exe Scriptpath\ReadLog.py  -f "file.log" -k "key" -e "errMsg" ') Found solution:
      RunWait( 'fullpath\Python.exe ReadLog.py -f "file.log" -k "key" -e "errMsg" ', 'Working_directory_path')  
      PFB description:
      https://stackoverflow.com/questions/45757834/how-to-pass-command-line-arguments-to-a-python-script-anyscript-while-executin
       
    • rootx
      By rootx
      I need help to understand why the run function does not work, but if i use it directly inside cmd shell the command works. $where is the name of the jpg file
      ShellExecute(@ComSpec ," /k C:\Users\root\Desktop\test\exiftool.exe -p $FileName "&'"'&$where&'"'&" > "&'"'&@ScriptDir&"\out.txt"&'"',@ScriptDir);<----- work Run("C:\Users\root\Desktop\test\exiftool.exe -p $FileName "&$where&" > "&@ScriptDir&"\out.txt",@ScriptDir);<--- doesn't work I would use the run command!
      Thx
    • nacerbaaziz
      By nacerbaaziz
      Hello
      How are you
      I have a question, please.
      I've created a window and i need
      when i run the script if it detect an other copy from the same script was runing
       the script close the first copy Automatically and run a new copy
      I want an example to understand it