将所有用户文档移动到子文件夹中

时间:2016-11-29 15:01:56

标签: powershell

我正在尝试编写一个脚本,将所有用户文档(当前位于“\ server \ share \%username%”)移动到“\ server \ share \%username%\ Documents”。
它将还检查文件夹是否存在,如果不存在,则会创建它。

为了测试这个工作我已经打破了脚本以测试每个部分并用Write-Host替换了实际的命令,这部分应该测试文件夹是否存在。

当我运行它并检查突出显示为黄色的用户主文件夹时,某些用户有一个文档文件夹,有些用户没有,但它应该只突出显示没有文档文件夹黄色的文件夹。

$userhomes = Get-ChildItem "D:\" | where {$_.Attributes -like '*Directory*'}
foreach($userhome in $userhomes) {
$exclude = "Documents"
$movesource = "D:\" + $userhome.Name
$movedest = "D:\"+ $userhome.Name +"\Documents"
$autodest = "D:\"+ $userhome.Name +"\Documents"+"\Autorecovery"
$docexists = Test-Path $movedest
$autoexists = Test-Path $autodest
$Search = "OU=Users,DC=domain,DC=co,DC=uk"
$Users = Get-ADUser -Filter * -SearchBase $Search

$users | % {

# Check if Documents folder already exists
If ($docexists -eq $false)
    {
# Create the Documents folder
# Get-Item -path $movesource | New-Item -ItemType Directory -Path "$movesource\Documents"
    Write-Host Documents folder does not exists for ($_.SamAccountName) -ForegroundColor Yellow
}
else
{
    Write-Host Documents folder already exists for ($_.SamAccountName) -ForegroundColor Red
}
}
}

创建文档文件夹后,如果文件夹不存在,我想创建另一个文件夹并将属性设置为隐藏。

# Check if Autorecovery folder already exists
If ($autoexists -eq $false)
{ 
    # Create the Autorecovery folder and set attributes
    Get-Item -path $movesource | New-Item -ItemType Directory -Path "$movesource\Documents\Autorecovery" | %{$_.Attributes="hidden"}
    Write-Host Documents and Autorecovery folder for ($_.SamAccountName) created -ForegroundColor Green
}
 else
{
 Write-Host Autorecovery folder already exists for ($_.SamAccountName) -ForegroundColor Red
}

一旦对此进行了排序,我就要检查文件夹路径“\\ server \ share \%username%\ documents”文件夹是否存在。
如果是,那么我想移动所有文件从“ %username%“文件夹到”Documents“文件夹,最后将AD主文件夹路径更改为指向新位置。

# Move Documents to new location
If ($docexists = $true)
{
Get-Childitem -path $movesource -exclude $exclude | Move-Item -Dest $movedest

    # Set user new home folder path
    Get-ADUser -Filter * -SearchBase $Search | Foreach-Object{

    $sam = $_.SamAccountName
    Set-ADuser -Identity $_ -HomeDrive "H:" -HomeDirectory "\\server\share\$sam\Documents"
}
else
{
Write-Host Documents folder does not exist for ($_.SamAccountName) -ForegroundColor Red
}
}
}

3 个答案:

答案 0 :(得分:0)

因此,我看到你列出的唯一问题是在第一部分,如果它们没有文档文件夹,它应该只是将用户着色为黄色。这里的问题似乎是你的循环嵌套。您的$users循环位于$userhomes循环内,所以现在为每个用户主目录设置所有变量,然后获取域中所有用户的集合,然后循环遍历该集合并使用为$userhomes循环的该步骤设置的变量填充每个变量,这与在$users循环中正在处理的用户无关。这里的解决方案只是消除$users循环,只输出文件夹的名称而不是用户samaccountname,就像我在下面一样,如果他们的主驱动器的名称反映了他们的帐户名,这应该有用。如果没有,你总是可以根据AD中的homedirectory属性进行查找,但是你需要将现有的文件名解析为网络名称。

$userhomes = Get-ChildItem "D:\" | where {$_.Attributes -like '*Directory*'}
foreach($userhome in $userhomes) {
$exclude = "Documents"
$movesource = "D:\" + $userhome.Name
$movedest = "D:\"+ $userhome.Name +"\Documents"
$autodest = "D:\"+ $userhome.Name +"\Documents"+"\Autorecovery"
$docexists = Test-Path $movedest
$autoexists = Test-Path $autodest


# Check if Documents folder already exists
If ($docexists -eq $false)
{
# Create the Documents folder
# Get-Item -path $movesource | New-Item -ItemType Directory -Path "$movesource\Documents"
Write-Host "Documents folder does not exists for $($userhome) -ForegroundColor Yellow"
}
else
{
Write-Host "Documents folder already exists for $($userhome) -ForegroundColor Red"
}
}

如果这些都不适合您,您还可以遍历用户集合并为他们计算主驱动器。你只需要以某种方式将两者联系起来,而你目前在嵌套循环中没有这样做。

答案 1 :(得分:0)

这应该为您排序,它检查并移动D:驱动器中的任何用户文件夹。然后通过AD并更新主文件夹。

$userhomes = Get-ChildItem "D:\" | where {$_.Attributes -like '*Directory*'}
foreach($userhome in $userhomes) {
    $movesource = "D:\" + $userhome.Name
    $movedest = "$movesource\Documents"
    $autodest = "$movedest\Autorecovery"
    $exclude = "Documents"

    # Check if Documents folder already exists
    If (Test-Path $movedest)
    {
        Write-Host Documents folder already exists for ($_.SamAccountName) -ForegroundColor Red
    }
    else
    {
        # Create the Documents folder
        # New-Item -ItemType Directory -Path $movedest
        Write-Host Documents folder does not exists for ($_.SamAccountName) -ForegroundColor Yellow
    }

    # Check if Autorecovery folder already exists
    If (Test-Path $autodest)
    {
     Write-Host Autorecovery folder already exists for ($_.SamAccountName) -ForegroundColor Red
    }
    else
    { 
        # Create the Autorecovery folder and set attributes
        New-Item -ItemType Directory -Path $autodest | %{$_.Attributes="hidden"}
        Write-Host Documents and Autorecovery folder for ($_.SamAccountName) created -ForegroundColor Green
    }

    # Move Documents to new location
    if (Test-Path $movedest)
    {
        Get-Childitem -path $movesource -exclude $exclude | Move-Item -Dest $movedest
    }
    else
    {
    Write-Host Documents folder does not exist for ($_.SamAccountName) -ForegroundColor Red
    }
}

# Set user new home folder path
Get-ADUser -Filter * -SearchBase $Search | Foreach-Object{
    $sam = $_.SamAccountName
    Set-ADuser -Identity $_ -HomeDrive "H:" -HomeDirectory "\\server\share\$sam\Documents"
}

答案 2 :(得分:0)

我想对所有的帮助表示非常感谢,这是我完成的脚本。 在任何阶段,它都会告诉我发生了什么以及是否有任何问题。

$userhomes = Get-ChildItem "D:\" | where {$_.Attributes -like '*Directory*'}
foreach($userhome in $userhomes) {
$exclude = "Documents"
$movesource = "D:\" + $userhome.Name
$movedest = "D:\"+ $userhome.Name +"\Documents"
$autodest = "D:\"+ $userhome.Name +"\Documents"+"\Autorecovery"
$testpath = "D:\"+ $userhome.Name +"\Desktop"
$Search = "OU=Users,DC=domain,DC=co,DC=uk"
$Users = Get-ADUser -Filter * -SearchBase $Search

# Test if Documents folder exists, create folder if it doesnt exist
If (Test-Path $movedest)
{
Write-Host Documents folder exists for $($userhome)

# Test if Autorecovery folder exists, create folder if it doesnt exist
If (Test-Path $autodest)
{
Write-Host Autorecovery folder exist for $($userhome)

    # Move Documents to new location
    If (Test-Path $testpath)
    {
    Get-Childitem -path $movesource -exclude $exclude | Move-Item -Dest $movedest
    Get-ChildItem -Path  $movesource -Exclude "Documents" | ? {$_.PSIsContainer} |Remove-Item -Recurse -force 
    Write-Host Documents being moved for $($userhome) -ForegroundColor Yellow


    }
    else
    {
    Write-Host Documents already moved for $($userhome)
    }

}    
else
{
# Create the Autorecovery folder and set hidden attribute
Get-Item -path $movesource | New-Item -ItemType Directory -Path "$movesource\Documents\Autorecovery" | %{$_.Attributes="hidden"}
Write-Host Autorecovery folder being created for $($userhome) -ForegroundColor Green

    # Move Documents to new location
    If (Test-Path $testpath)
    {
    Get-Childitem -path $movesource -exclude $exclude | Move-Item -Dest $movedest
    Get-ChildItem -Path  $movesource -Exclude "Documents" | ? {$_.PSIsContainer} |Remove-Item -Recurse -force 
    Write-Host Documents being moved for $($userhome) -ForegroundColor Yellow


    }
    else
    {
    Write-Host Documents already moved for $($userhome)
    }

}

}
else
{
# Create the Documents folder
Get-Item -path $movesource | New-Item -ItemType Directory -Path "$movesource\Documents"
Write-Host Documents folder being created for $($userhome) -ForegroundColor Green

# Check that Documents folder now exists
If (Test-Path $movedest)
{
Write-Host Documents folder now exists for $($userhome) -ForegroundColor Magenta
Get-Item -path $movesource | New-Item -ItemType Directory -Path "$movesource\Documents\Autorecovery" | %{$_.Attributes="hidden"}

    # Test if Autorecovery folder now exists
    If (Test-Path $autodest)
    {
    Write-Host Autorecovery folder Created for $($userhome) -ForegroundColor Green

        # Move Documents to new location
        If (Test-Path $testpath)
        {
        Get-Childitem -path $movesource -exclude $exclude | Move-Item -Dest $movedest
        Get-ChildItem -Path  $movesource -Exclude "Documents" | ? {$_.PSIsContainer} |Remove-Item -Recurse -force 
        Write-Host Documents being moved for $($userhome) -ForegroundColor Yellow


        }
        else
        {
        Write-Host Documents already moved for $($userhome)
        }

    }
    else
    {
    # Create the Autorecovery folder and set hidden attribute
    Get-Item -path $movesource | New-Item -ItemType Directory -Path "$movesource\Documents\Autorecovery" | %{$_.Attributes="hidden"}
    Write-Host Autorecovery folder being created for $($userhome) -ForegroundColor Green

       # Check if Autorecovery folder exists 
       If (Test-Path $autodest)
       {
       Write-Host Autorecovery folder now exists for $($userhome) -ForegroundColor Magenta

            # Move Documents to new location
            If (Test-Path $testpath)
            {
            Get-Childitem -path $movesource -exclude $exclude | Move-Item -Dest $movedest
            Get-ChildItem -Path  $movesource -Exclude "Documents" | ? {$_.PSIsContainer} |Remove-Item -Recurse -force 
            Write-Host Documents being moved for $($userhome) -ForegroundColor Yellow


            }
            else
            {
            Write-Host Documents already moved for $($userhome)
            }
       }
       else
       {
       Write-Host ERROR Autorecovery folder still does not exist for $($userhome) -ForegroundColor Red
       }

    }
}
else
{
Write-Host ERROR Documents folder still does not exist for $($userhome) -ForegroundColor Red
}
}
}