Start-Process -WorkingDirectory作为管理员运行不会设置位置。
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窗口,并指定自己的位置?
在使用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
参数,我们可以确保以管理员身份运行的进程的工作目录被正确设置。
在使用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
当使用Start-Process
命令以管理员身份运行时,如果目标可执行文件是.NET可执行文件,则-WorkingDirectory
参数会被应用;例如:
- pwsh.exe
(PowerShell(Core) CLI)会应用该参数。
- cmd.exe
和powershell.exe
(Windows 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 "@