我想编写一个PowerShell脚本获取以下参数作为input:
要从中复制的文件夹,扩展名允许,要复制到的文件夹以及指示是否应该重新启动IIS,用户名和密码的布尔值。
考虑到我正在复制到远程服务器,我应该考虑哪些cmdlet?
如何将参数读入variables?
我如何重新启动IIS?
考虑到我可能想要复制多个文件夹,我该如何编写一个调用powershell脚本的powershell脚本?
Get-ChildItem允许您列出文件和目录,包括recursion地使用文件名filter。 Copy-Item允许您复制文件。
在select文件方面有很多重叠,根据你所需要的细节, Copy-Item往往是足够的(例如你想保留文件夹结构吗?)
要将所有*.foo和*.bar从StartFolder复制到DestFolder:
Copy-Item -path "StartFolder" -include "*.foo","*.bar" -Destination "DestFolder"
如果您需要保留文件夹结构,事情会变得更加困难,因为您需要构build目标文件夹名称,如下所示:
$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
最后,select的方式将取决于所需的细节。
(在上面我已经避免了别名(例如Copy-Item而不是copy ),并明确地使用参数名称,即使它们是位置的。)
我无法解决IIS部分问题,但是保留目录结构的文件副本比其他答案中显示的要简单得多:
Copy-Item -path "StartFolder" -Recurse -Include "*.foo","*.bar" -Destination "DestFolder" -Container
“ -Container论点是将复制目的地结构的魔法部分,因为它在源代码中。
如果您使用IIS7,则可以使用本机组件在IIS服务器之间复制内容: http : //blog.theplanet.com/2010/05/18/mirroring-server-content-and-configuration-in-iis7/