在PowerShell脚本中传递运行时参数

时间:2018-11-07 22:08:34

标签: powershell

我有一个下面的powerShell脚本,可以为用户创建homedrive

Import-Module ActiveDirectory 2>&1 | Write-Host; 
if($?)
{

$homeDir = "\\CORP.com\HOME\Jdoe";
$user = "jdoe";
$domain = "Corp";

New-Item "$homeDir" -type directory;

$acl = Get-Acl "$homeDir";
$permission = "$domain\$user","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow";
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission;

$acl.SetAccessRule($accessRule);

$acl | Set-Acl "$homeDir";
}

$ homeDir和$ User中的值将在运行时基础上传递。

如何执行上述脚本以及$ homeDir和$ User属性中的传递运行时值。

我试图执行

. 'C:\hd.ps1' $homeDir = "\\CORP.com\HOME\test" $user = "test" ;没有成功。

任何人都可以指导,我在做什么不正确。

2 个答案:

答案 0 :(得分:1)

放入

param(
$homeDir,
$user
)

在脚本顶部,使用

进行调用
Powershell -File "C:\hd.ps1" -homeDir "\\CORP.com\HOME\test" -user "test" 

答案 1 :(得分:0)

您为什么要这样做?

Import-Module ActiveDirectory 2>&1 | Write-Host; 

如果您在DC上执行此操作,或者您的工作站上具有RSAT工具,如果您使用的是PowerShell v3 +或更高版本,则在使用AD cmdlet时会自动加载。

也不要为以后计划使用的任何内容使用Write-Host。它清空/清除缓冲区。 Write-Host仅适合s中的文本着色或其他格式需求

例如,从文件中获取一个集合,然后将其读入。我在这里仅使用一个列表:

$UserFile = @'
Property,Value
homeDir,\\CORP.com\HOME\Jdoe
user,jdoe
Targetdomain,Corp
'@ | ConvertFrom-Csv

# Results

Property     Value               
--------     -----               
homeDir      \\CORP.com\HOME\Jdoe
user         jdoe                
Targetdomain Corp 

如果您是从远程计算机上执行此操作,那么除非您设置其范围,否则无法在远程会话中使用本地变量。

Get-Help about_remote_variables -Full

About Remote Variables

  

详细说明

     

您可以在远程运行的命令中使用变量   只需为变量分配一个值,然后使用   变量代替值。

     

默认情况下,假定远程命令中的变量为   在命令运行的会话中定义。您也可以使用   在本地会话中定义的变量,但是您必须确定   在命令中将它们作为局部变量。

     

使用局部变量

     

您也可以在远程命令中使用局部变量,但是您   必须表明该变量是在本地会话中定义的。

     

从Windows PowerShell 3.0开始,您可以使用“使用”   scopemodifier,用于在远程命令中标识本地变量。

PowerShell中不需要分号,除非项目位于同一行。

您不能以这种方式调用此代码...

'C:\hd.ps1' $homeDir = "\\CORP.com\HOME\test" $user = "test"

...,因为您未在代码中指定任何参数。

所以,像这样...

注意:我无法对此进行测试...请仅在测试环境中进行 所以这是袖手旁观...

ForEach($UserLine in $UserFile)
{
    New-Item $UserLine.homeDir -type directory

    $acl = Get-Acl $UserLine.homeDir
    $permission = ($Using:UserLine.Targetdomain + '\' + $Using:UserLine.user),'FullControl', 'ContainerInherit, ObjectInherit', 'None', 'Allow'
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission

    $acl.SetAccessRule($accessRule)

    $acl | Set-Acl $Using:UserLine.homeDir
}

如果您希望将其作为参数化函数,则此..

Function New-ADUserHomeDirSettings
{
    [cmdletbinding()]

    Param
    (
        [string]$homeDir,
        [string]$user,
        [string]$Targetdomain
    )

    $acl = Get-Acl $UserLine.homeDir
    $permission = ($Using:UserLine.Targetdomain + '\' + $Using:UserLine.user),'FullControl', 'ContainerInherit, ObjectInherit', 'None', 'Allow'
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission

    $acl.SetAccessRule($accessRule)

    $acl | Set-Acl $Using:UserLine.homeDir
}

New-ADUserHomeDirSettings -homeDir '' -user '' -Targetdomain ''