Home > front end >  Multiple inputs into new prompt & Powershell -run as and -nonewwindow issue
Multiple inputs into new prompt & Powershell -run as and -nonewwindow issue

Time:09-21

Here is what I currently do, file 1:

powershell.exe -command "Start-Process cmd -ArgumentList '/c cd C:\ && DiskZero.cmd'-Verb runas"

And file 2 "DiskZero.cmd":

@echo off
(echo rescan
echo sel disk 1
echo cle all
echo cre part prim
echo for fs=ntfs quick label=Intenso
echo assign letter=E
)  | diskpart
pause

It works as intended, however, there is two files, what I want to do is make it so there's only one file.

I can't manage to find how to input multiple lines of code into a new elevated command prompt with only one script, so instead I'm trying to do it with powershell:

start cmd -nonewwindow works

start cmd -ver runas works

however start cmd -nonewwindow -ver runas doesn't work

What I was hoping to do was this in powershell:

start cmd -nonewwindow -ver runas
@echo off
(echo rescan
echo sel disk 1
echo cle all
echo cre part prim
echo for fs=ntfs quick label=Intenso
echo assign letter=E
)  | diskpart
pause

Can anyone help me solve the start cmd -nonewwindow -ver runas issue OR input multiple lines of code into a new elevated command prompt with only one file, please?

CodePudding user response:

Can anyone help me solve the start cmd -nonewwindow -verb runas issue

Unfortunately, there is no solution: Windows fundamentally does not allow you to run an elevated process (run as admin, requested with -Verb RunAs) directly in a non-elevated process' console window - that is why Start-Process syntactically prevents combining -NoNewWindow with -Verb RunAs.

OR input multiple lines of code into a new elevated command prompt with only one file, please?

While there is a solution, it'll be hard to maintain:

You can pass the lines of your second batch file (the one you want to eliminate) to cmd /c on a single line, joined with &:

  • Note: To facilitate side effect-free experimentation, the original diskpart command was replaced with findstr -n ., which merely prints the lines received via stdin, preceded by their line number.
powershell.exe -command "Start-Process -Verb RunAs cmd '/c cd C:\ && (echo rescan&echo sel disk 1&echo cle all&echo cre part prim&echo for fs=ntfs quick label=Intenso&echo assign letter=E) | findstr -n .&pause'"

That no space char. precedes each & is deliberate, because trailing whitespace in echo commands is significant, i.e. it becomes part of the output; however, it should be fine to place a space char. after each & (as well as before, if the preceding command ignores trailing whitespace).

A better solution is to create a temporary helper batch file from your batch file, pass its path to the PowerShell command, and delete it afterwards:

@echo off

:: Determine the path for a temporary batch file...
:: Note: %~snx0 uses the short (8.3) name of the batch file, so as
::       to ensure that the temp. file path has no spaces, which 
::       obviates the need for complex double-quoting later.
set "tmpBatchFile=%TEMP%\~%~snx0"

:: ... and fill it with the desired commands.
:: Note how metacharacters - ( ) | ... - must be ^-escaped.
(
echo @echo off
echo ^(echo rescan
echo echo sel disk 1
echo echo cle all
echo echo cre part prim
echo echo for fs=ntfs quick label=Intenso
echo echo assign letter=E
echo ^) ^| findstr -n .
echo pause
) > "%tmpBatchFile%"

:: Now you can let the elevated cmd.exe process that PowerShell launches
:: execute the temp. batch file.
:: Note: -Wait ensures that the PowerShell call blocks until the elevated 
::       cmd.exe window closes.
powershell.exe -command "Start-Process -Wait -Verb RunAs cmd '/c cd C:\ & %tmpBatchFile%'"

:: Delete the temp. batch file.
:: Note: If you do NOT use -Wait above, you'll have to defer deleting
::       the batch file until after the elevated cmd.exe window closes,
::       which you'll have to do manually.
del "%tmpBatchFile%"
  • Related