Import-PSSession 在脚本中失败,在 shell 中工作

Posted

技术标签:

【中文标题】Import-PSSession 在脚本中失败,在 shell 中工作【英文标题】:Import-PSSession fails in script, works in shell 【发布时间】:2017-04-17 20:56:25 【问题描述】:

我是 Powershell 脚本的新手,我正在处理用户管理 Powershell 脚本,但我遇到了一个奇怪的错误。

以下代码在我从 shell 运行时有效,但在从脚本运行时无效:

$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionURI http://servername/Powershell/ -Authentication Kerberos -Credential $UserCredential -AllowRedirection
Import-PSSession $Session

当我在第一行带有Param() 块的脚本中运行它时,它会失败并出现以下错误:

Import-PSSession: Cannot bind argument to parameter 'Path' becuase it is an empty string.

如果我删除我的Param() 块,我可以让Import-PSSession 工作,但我不确定如何接受我的脚本的命令行参数。如何保留Param() 块(或更一般地说,接受命令行参数)并且仍然能够导入 PS 会话?

我在尝试连接到 2010 Exchange 服务器的 Windows 2008 R2 服务器上使用 Powershell v2。

更新:

我有一个名为 ManageUser.ps1 的脚本,我从类似的 Powershell 提示符运行该脚本

.\ManageUser.ps1 -disableUser -username someuser

脚本开始如下:

Param(
    [switch]$disableUser,
    [string]$username
)
$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionURI http://servername/Powershell/ -Authentication Kerberos -Credential $UserCredential -AllowRedirection
Import-PSSession $Session
#more stuff past here...

Import-PSSession 命令失败。但是,如果我删除整个 Param(...),会话导入将起作用。我希望这足以让你理解它!

【问题讨论】:

您希望人们在不显示您的代码的情况下解决您的代码问题?你是如何编写param() 块的?你是怎么调用脚本的? @TessellatingHeckler 对不起,我以为我已经提供了足够的信息。我现在更新了我的问题。请让我知道是否还有其他有助于了解的信息!谢谢。 只是想知道您是否尝试将 -AllowClobber 选项添加到 Import-PSSession?也许Powershell在后台发生了一些默认参数设置? @SamuelWarren 我已经有一段时间没有使用这个脚本了,但我很确定我确实尝试过添加 -AllowClobber。感谢您的建议。 【参考方案1】:

您的脚本可以单独运行,并且在从另一个脚本中调用时也可以正常运行:

& 'C:\Scripts\ManageUser.ps1' -disableUser -username "foo"
Get-Mailbox -resultsize 5 | ConvertTo-Csv -NoTypeInformation | Out-File C:\Scripts\mytest.csv

由于没有@SamuelWarren 提到的-allowclobber,后续运行将收到导入错误/警告...

在您的情况下(至少在很久以前最初编写问题时),错误是由于您在此处未提及的另一个变量造成的。您可能在第一次运行后修复了该问题,随后的测试显示 AllowClobber 错误。

另外值得注意的是(对于将来遇到此问题的任何人)检查您正在调用的文件的路径。仅仅因为您尝试使用相对路径 .\myfile.ps1 并不意味着 PowerShell 当前正在查找正确的目录。

检查:$psscriptroot

Split-Path -Path $($global:MyInvocation.MyCommand.Path)

【讨论】:

以上是关于Import-PSSession 在脚本中失败,在 shell 中工作的主要内容,如果未能解决你的问题,请参考以下文章

Office 365 Troubleshooting:Import-PSSession 出错

Elastic Beanstalk 在启动脚本时失败

当 sftp 语句之一在 Linux 中失败时,sftp 脚本失败

Shell 脚本中的 Curl 可能在标题部分失败

SQL 脚本在 MySQL 中有效,但 mysqli->query() 失败;为啥?

Android Firebase:Robo 脚本在位置权限对话框中失败