Powershell - 从具有不同域凭据的不同位置复制文件
Powershell - copy file from various locations with different domain credentials
我正在寻找一种 powershell 解决方案,用于将给定的 filename.txt 从具有不同域登录凭据的多个服务器 unc 路径复制到给定文件夹 - 以及根据名称列表重命名文件名(或 case/if-stmt)并将每个服务器路径的子文件夹名称导出到以服务器和文件名作为列的 csv。
下面是我用于 one 服务器的代码 - 我只是添加了一些服务器和文件名。
你能帮我完成这项工作吗?
我使用 Powershell 版本 4。
示例:
$serverNames = @(
"\serverA\folderA";
"\serverB\folderA";
"\serverC\folderA";
)
$fileNames = @(
"fileServerA";
"fileServerB";
"fileServerC";
)
foreach ($element in $serverNames) {
Try {
If (Test-Path Q:){
Remove-PSDrive -Name "Q" -Force
# two server paths are in a different domain,
# so I need a case or if-stmt to pass login credentials
New-PSDrive -Name "Q" -PSProvider FileSystem -Root $element -Credential
}
else{
New-PSDrive -Name "Q" -PSProvider FileSystem -Root $element -Credential
}
#copy filename.txt (always the same name)
robocopy $element\SubFolder\ C:\temp\ filename.txt /R:2 /W:3 /XO
#rename filename.txt according to fileName
Move-Item C:\temp\filename.txt C:\temp$name.xml -Force
#scan dir and write foldernames (only "first" child folders) to .txt file with the according serverName AND fileName as columns
dir -Directory \serverA\folderA | Select-Object -ExpandProperty Name
}
}
如果您构建包含所有这些详细信息的对象数组会怎样?然后你可以用他们自己的凭据单独循环每个。
$servers = @()
$servers += [pscustomobject]@{
name = "\serverA\folderA"
files = "fileServerA"
creds = Get-Credential
}
$servers += [pscustomobject]@{
name = "\serverB\folderA"
files = "fileServerB"
creds = Get-Credential
}
$servers += [pscustomobject]@{
name = "\serverC\folderA"
files = "fileServerC"
creds = Get-Credential
}
$servers | ForEach-Object{
#.... Stuff here
}
如果服务器共享凭据,那么您可以在显示的声明之外声明凭据集以多次使用它们。在循环中,您现在可以调用 New-PSDrive
并使用参数 -Credential $_.creds
我正在寻找一种 powershell 解决方案,用于将给定的 filename.txt 从具有不同域登录凭据的多个服务器 unc 路径复制到给定文件夹 - 以及根据名称列表重命名文件名(或 case/if-stmt)并将每个服务器路径的子文件夹名称导出到以服务器和文件名作为列的 csv。
下面是我用于 one 服务器的代码 - 我只是添加了一些服务器和文件名。
你能帮我完成这项工作吗?
我使用 Powershell 版本 4。
示例:
$serverNames = @(
"\serverA\folderA";
"\serverB\folderA";
"\serverC\folderA";
)
$fileNames = @(
"fileServerA";
"fileServerB";
"fileServerC";
)
foreach ($element in $serverNames) {
Try {
If (Test-Path Q:){
Remove-PSDrive -Name "Q" -Force
# two server paths are in a different domain,
# so I need a case or if-stmt to pass login credentials
New-PSDrive -Name "Q" -PSProvider FileSystem -Root $element -Credential
}
else{
New-PSDrive -Name "Q" -PSProvider FileSystem -Root $element -Credential
}
#copy filename.txt (always the same name)
robocopy $element\SubFolder\ C:\temp\ filename.txt /R:2 /W:3 /XO
#rename filename.txt according to fileName
Move-Item C:\temp\filename.txt C:\temp$name.xml -Force
#scan dir and write foldernames (only "first" child folders) to .txt file with the according serverName AND fileName as columns
dir -Directory \serverA\folderA | Select-Object -ExpandProperty Name
}
}
如果您构建包含所有这些详细信息的对象数组会怎样?然后你可以用他们自己的凭据单独循环每个。
$servers = @()
$servers += [pscustomobject]@{
name = "\serverA\folderA"
files = "fileServerA"
creds = Get-Credential
}
$servers += [pscustomobject]@{
name = "\serverB\folderA"
files = "fileServerB"
creds = Get-Credential
}
$servers += [pscustomobject]@{
name = "\serverC\folderA"
files = "fileServerC"
creds = Get-Credential
}
$servers | ForEach-Object{
#.... Stuff here
}
如果服务器共享凭据,那么您可以在显示的声明之外声明凭据集以多次使用它们。在循环中,您现在可以调用 New-PSDrive
并使用参数 -Credential $_.creds