我想创建一个Powershell函数,它可以为一个参数接受2种不同类型的输入。
我将使用的示例是一个复制文件函数。
如果我像这样调用函数Copy-File –FileToCopy “c:test” –FileDestination “c:dest”
我希望该功能获取文件夹中的所有文件并将它们复制到目的地。
如果我像这样调用函数Copy-File –FileToCopy “c:filesToCopy.txt” –FileDestination “c:dest”
我希望该函数从文本文件中获取文件列表,然后将它们复制到文件目标。
因此,我不确定如何弄清楚的部分是如何使–FileToCopy参数变得智能并知道我给它的输入类型。复制文件的实际代码我可以做。
可能有更优雅的方法,但你可以做这样的事情:
1. 将"*"附加到参数值,并对其使用测试路径。在这种情况下,您将其视为文件夹,因此 c:\test 将变为 c:\test\*。
2一.如果 Test-Path 返回 true,则您有一个文件夹,可以继续复制其内容。
2b.如果测试路径返回 false,请转到步骤 3。
3. 对参数按原样使用测试路径。如果它返回 true,则它是一个文件。
更新
实际上,它比我想象的要简单得多。您可以将参数 PathType 与 TestPath 一起使用,并指定是要查找文件夹还是文件。
- PathType Container
将查找文件夹。
- PahType Leaf
将查找文件。
确定它是一个文本文件还是一个文件夹,然后从那里开始。 下面的函数应该可以帮助您入门,并且在脚本运行后可以像Copy-Thing -filename "sourcefile.txt" -Destination "C:place"
一样执行
Function Copy-Thing([string]$fileName,[string]$destination){
$thing = Get-Item $fileName
if ($thing.Extension -eq ".txt"){
Get-Content | %{
Copy-Item -Path $_ -Destination $destination
}
}
elseif ($thing.PSIsContainer){
Get-ChildItem -Path $fileName | %{
Copy-Item -Path $_.FullName -Destination $destination
}
}
else{
Write-Host "Please specifiy a valid filetype (.txt) or folder"
}
}