如何使用PowerShell自动将多个模块配置获取到不同的文件夹?

时间:2019-02-26 15:17:13

标签: powershell tfs automation msbuild azure-devops

我有多个文件夹,例如,www包含文件夹A,B,C等。该结构存在于INT,REG,DR,PROD等不同的环境中。每个都包含不同的web.config。

因此,我们需要提供一种自动方法来检入每个web.config的挑战。

以web_A_int.config,web_A_REG.config,Web_A_Prod.config,Web_A_DR.config和Web_B_int.config,Web_B_Reg_config等命名。

环境为TFS(2015)源代码控制,解决方案为基于.net的解决方案。

如果您需要了解任何问题,请告诉我。

如何在构建编译后维护此结构。或如何使用proj或Powershell脚本来实现它?

所需的输出: INT-> www-> A,B,C文件夹,并将每个web.config放置在各自的文件夹中。 REG-> www-> A,B,C->正确设置每个web.config和每个模块级别。

2 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是使用Web转换并创建一个web。{environment} .config文件,然后将该转换应用于部署。

Microsoft docs应该使您开始使用网络转换。如果您决定这样做,我可以为您提供一些有关如何执行此操作的Powershell代码。

答案 1 :(得分:0)

我对TFS中的Web服务器部署不熟悉,但是这里有一些常规的Powershell函数可用于构建循环:

$environmentTypes = @('INT', 'REG', 'DR', 'PROD')

Function Get-WebConfig([String]$Path)
{
    try {
        $configContent = Get-Content \\path\to\config\file
    }
    catch {
        Write-Debug "ERROR: Could not get content of $($Path)" 
    }

    return $configContent
}

Function Create-FolderStructure() {

    [cmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateSet('INT','REG','DR','PROD')]
        [String]$EnvironmentType,
        [Parameter(Mandatory)]
        [String]$Server,
        [Parameter(Mandatory)]
        [String[]]$FolderNames,
        [Parameter(Mandatory=$false)]
        [Switch]$CheckServerUp
    )
    Begin {}
    Process {
        try {
            if($CheckServerUp)
            {
                try {
                    Test-Connection -ComputerName $Server
                }
                catch {
                    Write-Debug "ERROR: Unable to test connection to $Server"
                }
            }

            foreach($item in $FolderNames)
            {
                try {
                    New-Item -Path "\\$Server\c$\www\$item" -ItemType Directory

                }
                catch {
                    Write-Debug "ERROR: Unable to create folder $item"
                }
                try {
                    switch($EnvironmentType)
                    {
                        'INT' 
                        {
                            $neededConfig = Get-WebConfig -Path \\path\to\your\intconfig
                            break
                        }
                        'REG'
                        {
                            $neededConfig = Get-WebConfig -Path \\path\to\your\regconfig
                            break
                        }
                        'DR'
                        {
                            $neededConfig = Get-WebConfig -Path \\path\to\your\drconfig
                            break
                        }
                        'PROD'
                        {
                            $neededConfig = Get-WebConfig -Path \\path\to\your\prodconfig
                            break
                        }

                        try {
                            New-Item -Path "\\$Server\c$\www\$item\Web_$EnvironmentType.config"
                            Set-Content -Path "\\$Server\c$\www\$item\Web_$EnvironmentType.config" -Value $neededConfig
                        }
                        catch {
                            Write-Debug "ERROR: Unable to create file"
                        }

                    }
                }
                catch {
                    Write-Debug "ERROR: Unable to get web config content"
                }
            }
        }
        catch {
            Write-Debug "ERROR: Could not get content of $($Path)" 
        }
    }
    End{}
}