当使用动词时,workingdirectory无效。
当使用动词时,workingdirectory无效。
使用Start-Process
命令时,当使用Verb
参数时,WorkingDirectory
选项不起作用,新的powershell总是在C:\WINDOWS\system32
目录下启动。为什么会这样?如何在不使用额外的cd
命令的情况下解决这个问题?
PS C:\> $PSVersionTable Name Value ---- ----- PSVersion 5.1.14393.0 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.14393.0 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 PS C:\> Start-Process -FilePath powershell.exe -Verb Runas -WorkingDirectory C:\ws\ # 新的powershell总是在system32目录下: Windows PowerShell 版权所有 (C) 2016 Microsoft Corporation。保留所有权利。 PS C:\WINDOWS\system32> pwd 路径 ---- C:\WINDOWS\system32
问题出现的原因是,当使用参数"-Verb RunAs"来以管理员权限运行进程时,"-WorkingDirectory"参数不起作用,进程的默认位置是"$env:SYSTEMROOT\system32"(通常是"C:\Windows\System32")。
要解决这个问题,可以使用以下方法:
1. 使用"cd"(或"Set-Location")命令来切换到指定的工作目录,然后再启动进程。例如:
Start-Process -FilePath powershell.exe -Verb Runas ` -ArgumentList '-NoExit -Command "cd C:\ws"'
2. 为了避免引用问题,可以将参数分别传递,除了命令字符串本身。例如:
Start-Process -FilePath powershell.exe -Verb Runas ` -ArgumentList '-NoExit', '-Command', 'cd C:\ws'
如果要将这种技术应用到调用通常使用"-File"而不是"-Command"参数的脚本文件上,需要切换到"-Command"方法。例如:
Start-Process -FilePath powershell.exe -Verb Runas ` -ArgumentList '-Command', 'cd C:\ws; & .\script.ps1'
需要注意的是,在其他情况下,"-WorkingDirectory"参数是起作用的,包括以当前用户身份运行进程、使用"-Verb RunAsUser"模拟不同的用户(需要交互式输入凭据)或以不同用户的非交互方式运行进程(使用"-Credential
需要注意的是,如果启动"pwsh.exe"(PowerShell Core的CLI),"-WorkingDirectory"参数将被尊重,并且默认情况下保留调用者的位置。