当使用动词时,workingdirectory无效。

22 浏览
0 Comments

当使用动词时,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

0
0 Comments

问题出现的原因是,当使用参数"-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 "参数)。但是,如果目标用户没有访问隐含的(当前位置)或显式指定的工作目录的权限,那么在第二种情况下,当前位置将默认为"C:\",并且在第三种情况下,"Start-Process"命令将失败。

需要注意的是,如果启动"pwsh.exe"(PowerShell Core的CLI),"-WorkingDirectory"参数将被尊重,并且默认情况下保留调用者的位置。

0