在批处理文件中运行powershell命令

时间:2014-04-16 14:52:00

标签: batch-file powershell

我正在尝试使用New-ADGroup创建一些Active Directory安全组,但我需要能够在批处理文件中执行这些安全组。我的目标是让脚本提示运行它的用户输入OU和在组名前面使用的分支前缀。

我刚刚开始使用Powershell,所以我仍然没有100%使用不同的括号和引号,我怀疑这是我的问题。

这是我的原始代码:

SET /P OU=Enter OU:
Set /P Prefix=Enter Prefix:
Powershell New-ADGroup -Name “%Prefix%-OWA Test” -SamAccountName “%Prefix%-OWA Test” -GroupCategory Security -GroupScope Global -path "OU=Groups,OU=%OU%,OU=Test1,DC=Test2,DC=Test3,DC=Test4,DC=com”

我能够在PowerShell中执行命令,以便批处理文件中的某些内容导致我的问题。我也尝试从等式中删除变量,然后执行以下操作:

powershell New-ADGroup -Name "ORF-OWA Test" -SamAccountName "ORF-OWA Test" -GroupCategory Security -GroupScope Global -path "OU=Groups,OU=Branch1,OU=Test1,DC=Test2,DC=Test3,DC=Test4,DC=com”

在这两种情况下我都收到以下错误:

New-ADGroup : Cannot convert 'System.Object[]' to the type 'System.String'
required by parameter 'Path'. Specified method is not supported.
At line:1 char:110
+ ... e Global -path OU=Groups,OU=Branch1
,OU=Test,DC=Test1,DC=Test2,DC=Test3,DC=com -Des ...
+                    ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-ADGroup], ParameterBin
   dingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.ActiveDirectory.
   Management.Commands.NewADGroup 

我读这篇文章的方式是错误的“Path”参数,但我不确定为什么在PowerShell中成功但不是从cmd提示符或bat文件中成功。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

在批处理文件中使用PowerShell时,您必须记住该行将被解析两次。首先是CMD,然后是PowerShell。这样做的个人规则是

  1. 在批处理或命令行中使用PowerShell时使用单引号。
  2. 如果包含特殊字符,则将整个powershell命令括在双引号中
  3. 示例:单引号:

    Powershell New-ADGroup -Name '%Prefix%-OWA Test' -SamAccountName '%Prefix%-OWA Test' -GroupCategory Security -GroupScope Global -path 'OU=Groups,OU=%OU%,OU=Test1,DC=Test2,DC=Test3,DC=Test4,DC=com'
    

    示例:显式命令,Scoped和用双引号括起来:

    PowerShell -Command "&{New-ADGroup -Name '%Prefix%-OWA Test' -SamAccountName '%Prefix%-OWA Test' -GroupCategory Security -GroupScope Global -path 'OU=Groups,OU=%OU%,OU=Test1,DC=Test2,DC=Test3,DC=Test4,DC=com'}"
    

    我没有时间测试这些是否有效,但试一试;)为了说明工作命令(注意它还需要两个输入变量),这里是我的一个批量powershell命令我用:

    PowerShell -Command "&{$nlm = [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]'{DCB00C01-570F-4A9B-8D69-199FDBA5723B}')); $connections = $nlm.getnetworkconnections(); $connections | foreach { if ($_.GetNetwork().GetCategory() -eq %Filter%) { $_.GetNetwork().SetCategory(%Category%); } }; }"