我想编写一个Powershell脚本,该脚本获取以下参数作为输入:
要从中复制的文件夹,扩展名允许的文件夹,要复制的文件夹以及指示更改是否应重新启动IIS,用户名和密码的布尔值。
考虑到要复制到远程服务器,我应该查看哪些cmdlet?
如何将参数读入变量?
如何重新启动IIS?
考虑到可能要复制多个文件夹,我该如何编写调用Powershell脚本的Powershell脚本?
我想编写一个Powershell脚本,该脚本获取以下参数作为输入:
要从中复制的文件夹,扩展名允许的文件夹,要复制的文件夹以及指示更改是否应重新启动IIS,用户名和密码的布尔值。
考虑到要复制到远程服务器,我应该查看哪些cmdlet?
如何将参数读入变量?
如何重新启动IIS?
考虑到可能要复制多个文件夹,我该如何编写调用Powershell脚本的Powershell脚本?
Answers:
Get-ChildItem
允许您列出文件和目录,包括使用文件名过滤器递归列出。Copy-Item
允许您复制文件。
在选择文件方面有很多重叠之处,根据Copy-Item
您所需要的详细信息(例如,是否要保留文件夹结构?),通常单独使用就足够了
要复制所有*.foo
并*.bar
从StartFolder到DestFolder:
Copy-Item -path "StartFolder" -include "*.foo","*.bar" -Destination "DestFolder"
如果您需要保留文件夹结构,那么事情就会变得更加困难,因为您需要构建目标文件夹名称,例如:
$sourcePath = 'C:\StartFolder'
$destPath = 'C:\DestFolder'
Get-ChildItem $sourcePath -Recurse -Include '*.foo', '*.bar' | Foreach-Object `
{
$destDir = Split-Path ($_.FullName -Replace [regex]::Escape($sourcePath), $destPath)
if (!(Test-Path $destDir))
{
New-Item -ItemType directory $destDir | Out-Null
}
Copy-Item $_ -Destination $destDir
}
但是robocopy
可能会更容易:
robocopy StartFolder DestFolder *.foo *.bar /s
最后,选择方式取决于所需细节。
(在上文中,我避免使用别名(例如Copy-Item
而不是copy
),并且即使它们位于位置,也显式使用参数名称。)
Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"
有和没有-递归-什么都没发生
我无法解决IIS部分,但是在保留目录结构的同时,文件副本比其他答案中显示的要简单得多:
Copy-Item -path "StartFolder" -Recurse -Include "*.foo","*.bar" -Destination "DestFolder" -Container
该-Container
参数是魔部分将复制结构在目的地,因为它是在源。
-Include
...尽管我可以不用它复制所有内容-Include
正如某些人在这里提到的-Include无效。
为了使其与嵌套文件夹一起使用,我使用了两个步骤:“过滤器” +删除空文件夹
#copy with folder structure
Copy-Item -path $source -Recurse -Filter "*.foo" -Destination $destination -Container
#remove empty folders
dir $destination -Directory -Recurse |
%{ $_.FullName} |
sort -Descending |
where { !@(ls -force $_) } |
rm
如果您使用的是IIS7,则可以使用本机组件在IIS服务器之间复制内容:http : //blog.theplanet.com/2010/05/18/mirroring-server-content-and-configuration-in-iis7/