Start-Process -WorkingDirectory作为管理员运行不会设置位置。

12 浏览
0 Comments

Start-Process -WorkingDirectory作为管理员运行不会设置位置。

当我输入命令Start-Process powershell -WorkingDirectory "D:\folder"时,它会打开一个新的PowerShell窗口,并将位置设置为D:\folder

但是,当我输入命令Start-Process powershell -WorkingDirectory "D:\folder" -Verb RunAs时,它会打开一个具有管理员权限的新的PowerShell窗口,但位置却设置为C:\Windows\system32

我该如何以管理员权限打开新的PowerShell窗口,并指定自己的位置?

0
0 Comments

在使用PowerShell时,有时候我们需要以管理员身份打开CMD或PowerShell,并且希望它们的工作目录是当前目录。下面的代码展示了如何实现这个功能:

Start-Process cmd -ArgumentList ("/k cd {0}" -f (Get-Location).path) -Verb RunAs

如果在脚本中使用,可以使用以下代码:

Start-Process cmd -ArgumentList ("/k cd {0}" -f $PSScriptRoot) -Verb RunAs

如果你想要在当前没有管理员权限的PowerShell会话中打开一个新的提权的PowerShell会话,可以使用以下代码:

Start-Process powershell.exe -ArgumentList ("-NoExit",("cd {0}" -f (Get-Location).path)) -Verb RunAs

或者

Start-Process powershell.exe -ArgumentList ("-NoExit",("cd {0}" -f $PSScriptRoot)) -Verb RunAs

在脚本中使用时也是一样的。

然而,有时候使用Start-Process -WorkingDirectory命令以管理员身份运行时,工作目录并没有被正确设置。这可能是因为在Windows操作系统中,以管理员身份运行的进程具有不同的工作目录。解决这个问题的方法是使用-WorkingDirectory参数来显式地设置工作目录。以下是修复问题的代码示例:

Start-Process -FilePath cmd.exe -ArgumentList ("/k cd {0}" -f (Get-Location).path) -WorkingDirectory (Get-Location).Path -Verb RunAs

或者

Start-Process -FilePath powershell.exe -ArgumentList ("-NoExit",("cd {0}" -f (Get-Location).path)) -WorkingDirectory (Get-Location).Path -Verb RunAs

通过在Start-Process命令中使用-WorkingDirectory参数,我们可以确保以管理员身份运行的进程的工作目录被正确设置。

0
0 Comments

在使用Start-Process命令作为管理员启动PowerShell时,设置工作目录的位置的问题可能会出现。以下是问题出现的原因和解决方法:

问题原因:

Start-Process命令的-WorkingDirectory参数被忽略,无法设置PowerShell的工作目录。这可能导致在管理员模式下启动PowerShell时,无法自动切换到指定的目录。

解决方法:

可以使用以下命令来解决此问题:

Start-Process powershell.exe -verb runAs -ArgumentList '-NoExit', '-Command', 'cd D:\folder'

运行以上命令后,Windows将以管理员身份启动PowerShell,并在指定目录中打开。

注意:由于-file和-command参数不能同时使用,如果需要在新的管理员PowerShell中启动PowerShell脚本,请将; & 'PathToPS1File';附加到cd ...字符串中,如此示例所示:stackoverflow.com/a/57033941/2441655

0
0 Comments

当使用Start-Process命令以管理员身份运行时,如果目标可执行文件是.NET可执行文件,则-WorkingDirectory参数会被应用;例如:

- pwsh.exePowerShell(Core) CLI)会应用该参数。

- cmd.exepowershell.exeWindows PowerShell CLI)则不会,它们总是使用C:\Windows\System32目录。

- 这个问题存在于PowerShell在幕后使用的.NET API的层面(参见System.Diagnostics.ProcessStartInfo),截至本文编写时(.NET 6.0.0-preview.4.21253.7)。

除非你明确知道你正在调用一个.NET可执行文件,否则需要一个解决方法来在新的进程中切换到所需的工作目录。下面是一个更健壮的替代方案:

$dir = $PWD.ProviderPath # 使用当前目录
Start-Process -Verb RunAs powershell.exe @"
-noexit -c Set-Location -LiteralPath "$dir"
"@

- 嵌入在"..."引号中的$dir确保路径中包含空格的情况下也能正确处理。(如果想要使用当前目录而不使用中间变量,将"dir"替换为"$($PWD.ProviderPath)"

- 使用$PWD.ProviderPath属性确保使用文件系统的本机路径(基于驱动器字母,也可以在cmd.exe中看到),因为调用会话的当前位置可能基于仅在PowerShell中使用的驱动器(参见New-PSDrive),而提升的进程可能没有定义(或者不是基于相同的根位置)。

针对从给定工作目录启动带GUI界面的应用程序的解决方法:

由于必须在新的提升进程中进行工作目录的更改,因此需要一个帮助shell进程来执行此操作,最好使用cmd.exe(以提高性能):

$exeToLaunch = 'Notepad.exe' # 可能包括参数
$dir = $PWD.ProviderPath # 使用当前目录
Start-Process -Verb RunAs -WindowStyle Hidden cmd.exe @"
/c cd "$dir" & $exeToLaunch
"@

0