如何解决以不同域账户执行PowerShell安装命令时的「目录名称无效」错误?
解决PowerShell新会话执行命令时“目录名称无效”的问题
我之前也碰到过类似的坑,核心原因是你传递脚本块给新PowerShell会话的方式不对,导致命令解析出了问题,再加上脚本里还有些冗余操作,才触发了“目录名称无效”的报错。咱们一步步来修正:
问题根源拆解
- 直接把
$ScriptBlock塞进Start-Process的-ArgumentList里,PowerShell会把脚本块当成普通字符串解析,路径、参数很容易出现转义错误 - 你在新会话的脚本块里重复创建了凭据——其实新会话已经用指定的域账户启动了,除非安装程序需要另一个账户,否则完全没必要多此一举
修正后的完整代码
1. 提前创建凭据(只需要执行一次)
$username = "DOMAIN\Username" $password = "P@ssword" $credentials = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $password -AsPlainText -Force))
2. 定义要执行的安装逻辑
先校验目录存在性,去掉冗余的凭据创建:
$ScriptBlock = { # 先确认工作目录存在,避免触发路径错误 if (-not (Test-Path "C:\TEMP\WinMagic\")) { throw "请先创建目录C:\TEMP\WinMagic\,或检查路径是否正确" } # 执行静默安装,新会话已用指定凭据启动,无需重复传-credential Start-Process -FilePath "C:\TEMP\WinMagic\SecureDoc_64.exe" -ArgumentList "/s" -WorkingDirectory "C:\TEMP\WinMagic\" -Wait }
3. 正确传递脚本块到新会话
用Base64编码传递脚本块,彻底避免字符串解析错误:
# 将脚本块转换为PowerShell可识别的Base64编码 $encodedScript = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($ScriptBlock.ToString())) # 启动新会话并执行编码后的脚本 Start-Process -FilePath powershell.exe -Credential $credentials -ArgumentList "-NoExit", "-EncodedCommand", $encodedScript
额外注意点
- 确保域账户对
C:\TEMP\WinMagic\目录有读写权限,不然也可能触发路径相关报错 -Wait参数可以让安装程序执行完成后再继续,避免会话提前结束- 如果安装程序确实需要用不同账户执行,再在脚本块里重新添加凭据参数即可
内容的提问来源于stack exchange,提问作者My9to5
相关产品推荐
相关产品推荐

