我是新来的,这是我的第一个问题。我查看了各种相关问题,但未能找到答案,所以我希望有人可以提供帮助。
我有一个脚本可以为用户帐户创建文件夹,并为其分配权限。我有一个.csv文件,其中包含我要创建的文件夹的名称。当我运行脚本时,它没有产生预期的结果,但我不确定我哪里出错了。
.csv文件的内容(每个都在一个单独的行上):
1001
1002
... 1003
没有标题,只有数字。
PS脚本我正在运行:
$csv = Import-Csv "E:\Support\usersOnly.csv" -Header @("Name")
ForEach ($line in $csv) {E:\Support\CreateFolders.ps1 -Path E:\blah\blahblah\$line -Access mydomain\$line -Permission modify}
这会调用文件夹创建脚本,看起来像这样(我发现这个,它不是我的):
param ([string]$Path, [string]$Access, [string]$Permission = ("Modify"), [switch]$help)
function GetHelp() {
$HelpText = @"
DESCRIPTION:
NAME: CreateFolder.ps1
Create Folders and sets permissions for user.
PARAMETERS:
-Path Folder to Create or Modify (Required)
-User User who should have access (Required)
-Permission Specify Permission for User, Default set to Modify (Optional)
-help Prints the HelpFile (Optional)
SYNTAX:
./CreateFolder.ps1 -Path C:\Folder\NewFolder -Access Domain\UserName -Permission FullControl
Creates the folder C:\Folder\NewFolder if it doesn't exist.
Sets Full Control for Domain\UserName
./CreateFolder.ps1 -Path C:\Folder\NewFolder -Access Domain\UserName
Creates the folder C:\Folder\NewFolder if it doesn't exist.
Sets Modify (Default Value) for Domain\UserName
./CreateFolder.ps1 -help
Displays the help topic for the script
Below Are Available Values for -Permission
"@
$HelpText
[system.enum]::getnames([System.Security.AccessControl.FileSystemRights])
}
function CreateFolder ([string]$Path) {
# Check if the folder Exists
if (Test-Path $Path) {
Write-Host "Folder: $Path Already Exists" -ForeGroundColor Yellow
} else {
Write-Host "Creating $Path" -Foregroundcolor Green
New-Item -Path $Path -type directory | Out-Null
}
}
function SetAcl ([string]$Path, [string]$Access, [string]$Permission) {
# Get ACL on FOlder
$GetACL = Get-Acl $Path
# Set up AccessRule
$Allinherit = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit"
$Allpropagation = [system.security.accesscontrol.PropagationFlags]"None"
$AccessRule = New-Object system.security.AccessControl.FileSystemAccessRule($Access, $Permission, $AllInherit, $Allpropagation, "Allow")
# Check if Access Already Exists
if ($GetACL.Access | Where { $_.IdentityReference -eq $Access}) {
Write-Host "Modifying Permissions For: $Access" -ForeGroundColor Yellow
$AccessModification = New-Object system.security.AccessControl.AccessControlModification
$AccessModification.value__ = 2
$Modification = $False
$GetACL.ModifyAccessRule($AccessModification, $AccessRule, [ref]$Modification) | Out-Null
} else {
Write-Host "Adding Permission: $Permission For: $Access"
$GetACL.AddAccessRule($AccessRule)
}
Set-Acl -aclobject $GetACL -Path $Path
Write-Host "Permission: $Permission Set For: $Access" -ForeGroundColor Green
}
if ($help) { GetHelp }
if ($Path -AND $Access -AND $Permission) {
CreateFolder $Path
SetAcl $Path $Access $Permission
}
我得到的输出是:
Permission: modify Set For: mydomain\@{Name=1018}
Creating E:\blah\blahblah\@{Name=1019}
Adding Permission: modify For: mydomain\@{Name=1019}
Exception calling "AddAccessRule" with "1" argument(s): "Some or all identity references could not be translated."
At E:\Support\CreateFolders.ps1:90 char:3
+ $GetACL.AddAccessRule($AccessRule)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : IdentityNotMappedException
Permission: modify Set For: mydomain\@{Name=1019}
Creating E:\blah\blahblah\@{Name=102}
Adding Permission: modify For: mydomain\@{Name=102}
当我想要的只是'102'时,它会创建一个名为'@ {Name = 102}'的文件夹。
我也尝试了没有标题的方法,在我的.csv文件顶部添加了一行名为'Name',但在那里也没有成功。如果我不包含标题,它会尝试使用第一个文件夹名称作为标题。
如果我手动运行此脚本(不提供.csv),它会成功运行,但我有超过一千个文件夹要创建,所以我宁愿自动化。我确信这很简单,因为我是PS脚本的新手。
提前感谢您的帮助!
答案 0 :(得分:1)
因此,您有一个没有标题的CSV和一个要导入的列。目前,您导入它的方式是使用属性名称填充$csv
和对象数组。您的脚本的其余部分将其视为字符串数组并忽略该属性。解决此问题的一个小改动是扩展该列。
$csv = Import-Csv "E:\Support\usersOnly.csv" -Header @("Name") | Select-Object -ExpandProperty Name
但实际上,因为它只有一列而且没有标题甚至不打扰这方面的CSV方面(反正它真的不是CSV。)
$csv = Get-Content "E:\Support\usersOnly.csv"
除了潜在的误导性变量名称之外,您只需更改一行即可。 (假设没有其他问题。)
您看到的@{Name=1018}
是您的 $csv
数组中某个元素的字符串表示形式(显示为散列表)。