使用存储的凭据启动第二个Powershell脚本,来自批处理文件&传递参数

时间:2013-10-10 23:31:09

标签: .net powershell batch-file

根据我在本网站上找到的其他一些建议,我已经成功地完成了我想去的地方,但是在传递的时候我已经陷入困境了链上的额外变量。

我需要以管理员身份运行特定脚本,因此我创建了一些不同的PS1脚本来处理问题。我已经创建了一个安全密码并将其保存到文件中。

我有一个批处理文件,现在有以下调用:

powershell -ExecutionPolicy RemoteSigned -File "C:\Scripts\ScriptLauncher.ps1" "<DOMAIN>\<username>" "C:\Scripts\pwd.txt" "C:\Scripts\Test.ps1" %1 %2

传入,用户名,密码文件路径,要运行的脚本以及其他两个变量。 * DOMAIN&amp; USERNAME在批处理文件中提供。

内部ScriptLauncher,我收集了以下参数:

 param(
    $username,
    $passwordPath,
    $scriptToRun,
    $p1,
    $p2,
    $p3,
    $p4
 )

然后我创建要使用的凭证:

$cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,ConvertTo-SecureString (Get-Content -Literalpath $passwordPath))

现在这就是我遇到问题的地方,我可以在使用Keith的建议后运行它,同时使用字符串作为我希望运行的脚本的路径。但是,我试图让这个应用程序能够运行多个脚本,所以我希望能够将路径传递给我拥有的任何PS脚本,然后运行它。

因此,考虑到这一点,我现在转到以下代码:

$blockString = '{ param($p1,$p2,$p3,$p4) &"'+$scriptToRun+'" @($p1,$p2,$p3,$p4)}'
$scriptBlock = [scriptblock]::Create($blockString)
Invoke-Command -ScriptBlock $scriptBlock -ArgumentList @($p1,$p2,$p3,$p4) -ComputerName localhost -Credential $cred

如果我只使用字符串运行上面的Invoke命令,它可以正常工作。但是使用替换它会运行,但没有任何反应。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,所以我终于解决了。感谢基思指出我正确的方向。

因此,为了按照我的意图运行脚本,我需要以下Invoke-Command:

Invoke-Command -ScriptBlock { param($script,$p1,$p2,$p3,$p4) &$script @($p1,$p2,$p3,$p4)} -ArgumentList @($scriptToRun,$p1,$p2,$p3,$p4) -ComputerName localhost -Credential $cred

很高兴现在一切正常!