![编写 powershell 脚本将具有特定扩展名的文件从一个文件夹复制到另一个文件夹](https://linux22.com/image/528411/%E7%BC%96%E5%86%99%20powershell%20%E8%84%9A%E6%9C%AC%E5%B0%86%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E6%89%A9%E5%B1%95%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6%E4%BB%8E%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E5%A4%8D%E5%88%B6%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9.png)
我想编写一个 powershell 脚本,获取以下参数作为输入:
要从中复制的文件夹、允许的扩展、要复制到的文件夹以及指示更改是否应重新启动 IIS 的布尔值、用户名和密码。
考虑到我正在复制到远程服务器,我应该查看哪些 cmdlet?
如何将参数读入变量?
如何重新启动 IIS?
考虑到我可能想要复制多个文件夹,如何编写调用 powershell 脚本的 powershell 脚本?
答案1
Get-ChildItem
允许您列出文件和目录,包括使用文件名过滤器递归列出。Copy-Item
允许您复制文件。
在选择文件方面有很多重叠,通常Copy-Item
单独选择就足够了,具体取决于您需要的详细信息(例如,您是否要保留文件夹结构?)
要将所有文件从 StartFolder 复制*.foo
到*.bar
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
)并且明确使用参数名称,即使它们是位置相关的。)
答案2
我无法解决 IIS 部分,但在保留目录结构的同时复制文件可以比其他答案中显示的简单得多:
Copy-Item -path "StartFolder" -Recurse -Include "*.foo","*.bar" -Destination "DestFolder" -Container
参数-Container
是一个神奇的部分,它将复制目标中的结构,就像在源中一样。
答案3
对我有用的唯一解决方案是
Copy-Item -path 'c:\SourceFolder\*.foo' -destination 'c:\DestFolder'
使用参数的其他解决方案-Include
不起作用。
答案4
如果您使用的是 IIS7,则可以使用本机组件在 IIS 服务器之间复制内容: http://blog.theplanet.com/2010/05/18/mirroring-server-content-and-configuration-in-iis7/