![](/img/trans.png)
[英]Powershell + EWS script to move all text messages to Inbox/SMS subfolder
[英]Move all users documents into a subfolder
我试图编写一个脚本,将所有用户文档(当前在“ \\ server \\ share \\%username%”中)移动到“ \\ server \\ share \\%username%\\ Documents”中。
它还将检查documents文件夹是否存在,如果不存在,则会创建它。
为了测试这项工作,我已经分解脚本来测试每个部分,并用Write-Host替换了实际命令,该部分应该进行测试以查看documents文件夹是否存在。
当我运行它并检查突出显示为黄色的用户主文件夹时,一些用户有一个documents文件夹,而另一些则没有,但它只应突出显示那些没有黄色documents文件夹的用户。
$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
}
}
}
创建documents文件夹后,如果该文件夹尚不存在,我想创建另一个文件夹并将属性设置为Hidden。
# 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
}
}
}
因此,我看到您列出的唯一问题是在第一部分,当用户没有文档文件夹时,它应该仅将用户涂成黄色。 这里的问题似乎是您的循环嵌套。 您的$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"
}
}
如果这些都不适合您,您还可以遍历用户集合并为其计算主驱动器。 您只需要以某种方式将两者关联起来,而您目前不在嵌套循环中这样做。
这应该为您排序,它检查并移动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"
}
我要感谢所有帮助,这是我完成的脚本。 在任何阶段,它都会告诉我发生了什么以及是否有任何问题。
$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
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.