How to start PowerShell script from BAT file with proper Working Directory?

16,705

The -WorkingDirectory parameter doesn't work when using -Verb RunAs. Instead, you have to set the working directory by calling cd within a -Command string.

This is what I use: (cmd/batch-file command)

powershell -command "   Start-Process PowerShell -Verb RunAs \""-Command `\""cd '%cd%'; & 'PathToPS1File';`\""\""   "

If you want to make a "Run script as admin" right-click command in Windows Explorer, create a new registry key at HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Run with PowerShell (Admin)\Command, and set its value to the command above -- except replacing %cd% with %W, and PathToPS1File with %1 (if you want it to execute the right-clicked file).

Result: (Windows Explorer context-menu shell command)

powershell -command "   Start-Process PowerShell -Verb RunAs \""-Command `\""cd '%W'; & '%1';`\""\""   "

EDIT: There's an alternative way to have the script be run as admin from Explorer, by using the "runas" sub-key: https://winaero.com/blog/run-as-administrator-context-menu-for-power-shell-ps1-files


If you want to run your script as admin from an existing powershell, remove the outer powershell call, replace %W with $pwd, replace %1 with the ps1 file-path, and replace each \"" with just ".

Note: The \""'s are just escaped quotes, for when calling from the Windows shell/command-line (it's quote-handling is terrible). In this particular case, just \" should also work, but I use the more robust \"" for easier extension.

See here for more info: https://stackoverflow.com/a/31413730/2441655

Result: (PowerShell command)

Start-Process PowerShell -Verb RunAs "-Command `"cd '$pwd'; & 'PathToPS1File';`""

Important note: The commands above are assuming that your computer has already been configured to allow script execution. If that's not the case, you may need to add -ExecutionPolicy Bypass to your powershell flags. (you may also want -NoProfile to avoid running profile scripts)

Share:
16,705

Related videos on Youtube

Hooch
Author by

Hooch

Updated on September 17, 2022

Comments

  • Hooch
    Hooch over 1 year

    I'm trying to create bat script that can start PowerShell script named the same as bat file in proper working directotry.

    This is what I got:

    @ECHO OFF
    PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""%~dpn0.ps1""' -WorkingDirectory '%~dp0' -Verb RunAs}"
    PAUSE
    

    Passing working directory this way does not work.

    How to make script that will pass proper working directroy and also command line arguments?

    • Bill_Stewart
      Bill_Stewart
      You can't set an initial working directory for the process when elevating - it will default to System32 (or SysWOW64 for 32-bit process). This is by design.
  • mklement0
    mklement0 over 4 years
    Nice; however, it's problematic to use ' for quoting filesystem paths, given that ' is a legal filename character - better to use ". In the case of your last command this means: Start-Process PowerShell -Verb RunAs "-Command cd \`"$pwd\`"; & \`"PathToPS1File\`""
  • Michael Villani
    Michael Villani over 4 years
    Is it possible to pass parameters to the .ps1 file to be executed with PathToPS1File?
  • Jay
    Jay over 2 years
    Also trying to figure this out. I need arguments to be passed in to the script.