PsExec 运行参数中带有空格的 PowerShell cmdlet

PsExec 运行参数中带有空格的 PowerShell cmdlet

我尝试使用 PsExec 在远程计算机上运行 Expand-Archive,并将其提取到 Program Files 内的文件夹中,但 Expand-Archive 一直返回错误:

Expand-Archive : A positional parameter cannot be found that accepts argument 'Files\Folder'

我认为这意味着 Expand-Archive 进入“Program Files”中的空间并认为一个参数已经完成并开始尝试解释下一个参数。

我使用了以下命令的变体,均得到相同的结果:

用双引号括住整个 Powershell 部分,使用 %programfiles% 环境变量:

.\PsExec.exe \\computername /s cmd /c "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command expand-archive c:\temp\bc.zip -destinationpath %programfiles%\Folder"

在目标文件夹路径周围使用单引号,使用 %programfiles% 环境变量:

.\PsExec.exe \\computername /s cmd /c C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command expand-archive c:\temp\bc.zip -destinationpath '%programfiles%\Folder'

在目标文件夹路径周围加上双引号,使用 %programfiles% 环境变量:

.\PsExec.exe \\computername /s cmd /c C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command expand-archive c:\temp\bc.zip -destinationpath "%programfiles%\Folder"

没有引号,使用 %programfiles% 环境变量:

.\PsExec.exe \\computername /s cmd /c C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command expand-archive c:\temp\bc.zip -destinationpath %programfiles%\Folder

用双引号括住完整输入的文件夹路径:

.\PsExec.exe \\computername /s cmd /c C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command expand-archive c:\temp\bc.zip -destinationpath "C:\Program Files\Folder"

答案1

我尝试使用 psexec 执行相同操作,但遇到了各种错误。

我个人会使用 powershell 的invoke 命令。这对你也适用吗?如果不行的话,如果你愿意的话,我会尝试多摆弄一下 psexec。

例子 :

$PATH = "输入路径"

$COMPUTERNAME = "输入计算机名称"

调用命令 -ComputerName $COMPUTERNAME -ScriptBlock {

    $DESTINATIONPATH = $env:ProgramFiles
    Expand-Archive -Path $using:PATH -DestinationPath $DESTINATIONPATH

}

该脚本将在给定的计算机上运行,​​$env:ProgramFiles 转换为远程计算机上的变量,相当于 cmd 中的 %programfiles%。

答案2

我不会说接受的答案不正确,但我认为它没有针对实际问题。

这里不存在任何问题PSExec,但存在PowerShell命令调用方式的问题。

在调用 Powershell 命令时,很多时候我们不能直接传递不带引号的命令,尤其是那些需要带引号的参数的命令,例如间隔路径操作系统目录结构。因此,我们必须&在调用命令时在命令前加上 & 符号,并转义命令内部的引号作为参数,这大致如下所示:

powershell "& Expand-Archive \"<filepathwithspaces>\" \"<targetfolderpathwithspaces>\""

或者

.\PsExec.exe \\computername /s cmd /c C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command "& expand-archive c:\temp\bc.zip -destinationpath \"C:\Program Files\Folder\""

您也可以忽略-command上面一行中的开关,只要&在实际命令之前正确提供即可:)

相关内容