在未来的迭代中使用来自先前迭代的变量

Use a variable from a previous iteration in a future iteration

如果公司相同,是否可以在未来的迭代中使用 else 语句中的 $SecretFolder。例如。一个公司的列表中存在多个用户,但他们都需要为 1 个文件夹生成 link,以便公司访问。

#Location of original dataset
$csv = Import-Csv c:\export.csv

#loops through every line of the csv
Foreach ($line in $csv){

    #Generate random folder name (8 Characters long)
    $SecretFolder = -join ((48..57) + (97..122) | Get-Random -Count 8 | % {[char]$_})

    #Create URL
    $url = "www.website.com.au/2017Rates/$SecretFolder"


    #Test: Has the company already had a folder created
    if (Get-Variable $line.CompanyName -Scope Global -ErrorAction SilentlyContinue)
        {
           #Append URL to CSV for a person who already has a company folder
           $report =@()
           $report += New-Object psobject -Property @{CompanyName=$line.CompanyName;FirstName=$line.FirstName;LastName=$line.LastName;EmailAddress=$line.EmailAddress;'Letter Type'=$line.'Letter Type';URL=$URL}
           $report | export-csv testreporting.csv -Append
        }

     else 
     {
        #Create Folder with Random Cryptic name
        mkdir C:\Users\bford\test$SecretFolder

        #Copy item from FileLocation in CSV to SecretFolder Location
        Copy-Item -Path $line.FileLocation -Destination c:\users\bford\test$SecretFolder -Recurse -ErrorAction SilentlyContinue

        #Create Variable for Logic test with the Name CompanyName
        New-Variable -Name $line.CompanyName

        #Append csv with the updated details
        $S_report =@()
        $S_report += New-Object psobject -Property @{CompanyName=$line.CompanyName;FirstName=$line.FirstName;LastName=$line.LastName;EmailAddress=$line.EmailAddress;'Letter Type'=$line.'Letter Type';URL=$url}
        $S_report | export-csv testreporting.csv -Append

    }
}

#Cleanup remove all the variables added
Remove-Variable * -ErrorAction SilentlyContinue

您有什么理由认为不可能吗?是的,这是可能的,您应该 Google 哈希表并发现它们可以完成您尝试使用 get-variable 做的所有事情,而且效果更好。

但你的问题相当于 "how do I rewrite my script so it works?",重写你的脚本对我来说意味着摆脱重复的 @()+= 三行、神秘数字、全局变量、额外变量和 if/else,它最终完全是一个完全不同的脚本。

一个完全不同且大部分未经测试的脚本:

# import and group all people in the same company together
# then loop over the groups (companies)
Import-Csv -Path c:\export.csv |                      
  Group-Object -Property CompanyName |              
  ForEach-Object {

    # This loop is once per company, make one secret folder for this company.
    $SecretFolder = -join ( [char[]]'abcdefghijklmnopqrstuvwxyz1234567890' | Get-Random -Count 8 )
    New-Item -ItemType Directory -Path "C:\Users\bford\test$SecretFolder"

    # Loop through all the people in this company, and copy their files into this company's secret folder
    $_.Group | ForEach-Object {
        Copy-Item -Path $_.FileLocation -Destination c:\users\bford\test$SecretFolder -Recurse -ErrorAction SilentlyContinue
    }

    # Output each person in this company with just the properties needed, and a new one for this company's URL
    $_.Group | Select-Object -Property CompanyName , FirstName, 
                                       LastName, EmailAddress, 'Letter Type', 
                                       @{Name='Url'; Expression={"www.website.com.au/2017Rates/$SecretFolder"}}

} | Export-Csv -Path testreporting.csv -NoTypeInformation

但是要编辑您的脚本以执行您想要的操作,请使用哈希表,例如

$SecretFolders = @{} #at top of your script, outside loops

# in loops:
if (-not $SecretFolders.ContainsKey($line.CompanyName))
{
    $SecretFolders[$line.CompanyName] = -join (random name generation here)    
}

$SecretFolder = $SecretFolders[$line.CompanyName]