运行Powershell脚本,该脚本使用-List(参数)和

时间:2016-04-27 01:10:32

标签: powershell automation parameter-passing invoke-command start-process

我很难让这个简单的(?)功能在今天工作。

我有一个PowerShell脚本,可以从基于txt的文件中读取计算机名称。通过以下单行程序从PowerShell会话运行时,它可以正常工作:

./"Server Health Check.ps1" -List One-off.txt

正如您所看到的,它有一个很长的文件名,所以它用引号括起来。

但是,我正在构建一个带有无线电盒的PowerShell GUI表单,它将传递一个文本文件选项,用于调用脚本。诀窍是,脚本需要使用备用管理员帐户运行,而且我不清楚如何使其工作。

对于另一个脚本我没有使用我知道我可以使用下面的内容,这使用旧的DOS“runas”,但是,它不适用于-list函数。

invoke-command -scriptblock {runas.exe /user:domain\$Env:Username"admin" "powershell.exe -file \"\\Server\c$\LONG FOLDER\Server Health Check.PS1""}

因此,简而言之,如何使用从命令行读取参数(-List)的备用凭据来启动脚本?我也热衷于保留我的目录结构,其中包括带空格的文件夹。该脚本的标题为:“服务器运行状况check.ps1”

我尝试的最后一件事是以下

$ScriptPath = "C:\SCRIPTS FOLDER\Server Health Check.ps1"
$ArgList = "-List C:\SCRIPTS FOLDER\One-off.txt"
Invoke-Command -filepath $ScriptPath -Credential DragonBallDomain\$Env:UserName"Admin"  -ArgumentList $ArgList

结果如下:

Invoke-Command : Parameter set cannot be resolved using the specified named parameters.

我几乎可以肯定这可以通过invoke-command或start-process来实现,只需要获得正确的格式化?我可能在启动过程或调用命令的试验中错过了一个/或“或”某个地方。

任何帮助表示赞赏!

4月30日更新:

我已经尝试了更多来完成这项工作,我很接近,但仍然没有那么做。

$LongScriptPath = resolve-path Script.ps1
$LongFolderPath = \\UNC\PATH TO FOLDER\WITH LONG NAME\
 start-process -filepath powershell.exe -argumentlist " -file``"$($FilePath.path)`"" -cred DOMAIN\USERID -WorkingDirectory "$LongFolderPath"

添加-credential是导致错误的原因,该错误指出-file参数无效。我确信有办法做到这一点。

1 个答案:

答案 0 :(得分:1)

注意:在要求变得更加清晰后完全重写。

以其他用户本地 运行命令,请使用Start-Process -Credential ...

这是您原则上在更新中尝试过的内容,但是您传递参数的方式存在问题;试试这个:

$LongScriptPath = resolve-path Script.ps1
$LongFolderPath = '\\UNC\PATH TO FOLDER\WITH LONG NAME\'
start-process `
  powershell.exe `
  -ArgumentList '-file', $LongScriptPath, '-List', 'One-off.txt' `
  -Credential DOMAIN\USERID `
  -WorkingDirectory $LongFolderPath
  • 使这项工作的关键是通过powershell.exe的{​​{1}}参数传递所有参数作为数组传递给Start-Process,这意味着参数必须是-ArgumentList - 分开。

    • 请注意如何在表达式模式下解析数组,这意味着,-file等文字字符串元素必须引用
    • 一般来说,理解PowerShell的两种基本解析模式参数模式表达模式之间的区别非常重要,并且在应用时应用{ - 3} }
  • 添加-List以等待脚本完成;默认情况下,-Wait 异步(名为Start-Process的所有PS cmdlet都是)。

    • 警告:对于以其他用户身份调用的命令,您只能等待提升提示符。
      如果不是,该命令仍将执行,但将异步执行,并且您将在当前控制台中收到Start-*错误消息;实际上,Access denied被忽略。
  • 仅当以其他用户身份运行时:如果要在当前控制台窗口中运行脚本,请添加-Wait; -NoNewWindow -Wait默认为Start-Processpowershell.exe等控制台应用程序打开一个新窗口。

    • 如果您以其他用户身份运行该命令,则会悄悄忽略cmd.exe

至于原始症状和为什么使用-NoNewWindow在本地运行命令,因为不同的用户是不明智的

  • Invoke-Command要求同时指定Invoke-Command -Credential ...参数。

    • 运行-ComputerName以查看涉及Get-Help Invoke-Command参数的所有参数集。 OP的原始命令只有-Credential,但不是-Credential,这导致PS抱怨没有明确标识参数集。
  • 使用-ComputerName后,即使您指定-ComputerName - 本地计算机 - ,也始终使用PowerShell 远程处理唯一的目标计算机。

    • 使用远程处理有两个含义:
      • 默认情况下无法使用远程处理,必须在目标计算机(本例中为本地计算机)上进行远程处理。
      • 使用远程处理需要使用 admin 权限进行调用。

简而言之:

  • 虽然可以使用.执行纯粹的本地调用,但您不能像其他用户那样执行,因为这总是涉及远程处理。

  • 相比之下,
  • Invoke-Command仅用于在本地运行命令 ,可选择作为其他用户。