0
votes

I tried to launch a long powershell script with the name "long name here.ps1" from command prompt. But I am also trying to ensure that it runs as an administrator command in powershell. I have all execution policies in powershell set accordingly I used the ss64 set-executionpolicy command guide for powershell to get powershell working. But I am trying to use the solution from another stackoverflow question that talks about running commands as administrator. I am running a batch script that needs to execute a powershell script (.ps1) as admin, and I don't mind if the user is prompted by UAC or for the password. I am currently using the following command:

powershell.exe -command "&{ Start-Process powershell -ArgumentList '-noprofile -file "C:\long name here.ps1"' -verb RunAs}"

I found this command at https://ss64.com/ps/powershell.html at the bottom where there are details on how to run a powershell command as administrator. The problem with that code is that my powershell script 1. has arguments, and 2. has a long name. I have tried many different iterations of this command with no success, and the ones that DON'T work are listed below:

powershell.exe -command "&{ Start-Process powershell -ArgumentList '-noprofile -file C:\long` name` here.ps1' -verb RunAs}"

powershell.exe -command "&{ Start-Process powershell -ArgumentList '-noprofile -file:"C:\long name here.ps1' -verb RunAs}"

Also, I am completely lost as to how to send arguments to the actual script.

3
This link may be relevantBryce McDonald
I'm not hitting the max-length of my command. The problem is the -file option for powershell. It is not recognizing my filename and therefore does not run it at all.Henry Wl
I know Task Scheduler has a 256 char limit but I tested that by passing a 291 char argument to a PowerShell script in the same manner as the OP is trying to run his file, and it worked fine. If there is a limit it's going to be unreasonable to hit.Deadly-Bagel

3 Answers

-1
votes

When you use PowerShell.exe -Command you don't need to use quotes. For example, you can run the following:

PowerShell.exe -Command Get-Service 'wuauserv'

Everything after -Command is interpreted as the command. Note also that double quotes in CMD need escaping with a backslash. Therefore:

powershell.exe -Command Start-Process PowerShell -ArgumentList '-NoProfile -File \"C:\long name here.ps1\"' -Verb RunAs

If your file has arguments:

powershell.exe -Command Start-Process PowerShell -ArgumentList '-NoProfile -File \"C:\long name here.ps1\" \"Arg1\" \"Arg2\"' -Verb RunAs
0
votes

If I'm reading your question correctly - powershell wont find the file as it stops reading the path name when it encounters a blank space?

The example given here specifies that; powershell commands to be run from command prompt as an administrator should have the following syntax:

powershell.exe -noprofile -command "&{ start-process powershell -ArgumentList '-noprofile -file MyScript.ps1' -verb RunAs}"

Couple of ways to achieve what you're looking for. But the easiest method would be to escape the quotes using a ` character. So something similar to;

powershell.exe -noprofile -command "&{ start-process powershell -ArgumentList '-noprofile -file `"C:\long file name.ps1`"' -verb RunAs}"

Also might be worth checking out other answers here

0
votes

Use a Freeware Third Party Utility

If a freeware third-party executable is permissible, you can use a short tool I wrote called elevate32.exe (32-bit) and elevate64.exe (64-bit) to launch powershell.exe as administrator with the -File parameter and the script arguments you want to use:

elevate64 -- powershell.exe -File "<path>\<long script name>.ps1" -Arg "<long script argument>"

You can get the tool from www.westmesatech.com (copyrighted freeware, free to use anywhere, no installation needed).

Use a WSH Script

If you can't use an external executable, you can also do this (although it does not handle quoting in as robust a manner as the elevate tool's -- parameter) using a Windows Script Host (WSH) script, elevate.js:

var args = WScript.Arguments;
if ( args.Length >= 1 ) {
    var exec = args.Item(0);
    var cmdLine = "";
    for (var i = 1; i < WScript.Arguments.Length; i++ ) {
      cmdLine += cmdLine == "" ? '"' + args.Item(i) + '"' : ' "' + args.Item(i) + '"';
    }
    var shellApp = new ActiveXObject("Shell.Application");
    shellApp.ShellExecute(exec, cmdLine, "", "runas");
}

You can call as follows:

wscript.exe "d:\path\elevate.js" powershell.exe -File "C:\long path\script name.ps1" "long script argument"

Self-Elevate your PowerShell Script

Another option is to write a self-elevating PowerShell script. You can check for elevation in the script; if not elevated, it can launch itself elevated and run any command you need. Example:

$isElevated = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

if ( -not $isElevated ) {
  Start-Process powershell.exe "-File",('"{0}"' -f $MyInvocation.MyCommand.Path) -Verb RunAs
  exit
}

& "d:\long path name\script name.ps1" "Long Argument 1" "Long Argument 2"