我编写了一个脚本,用于从服务器归档日志文件。除了Get-ChildItem ...
的递归与否之外,我的状态非常好我似乎遇到的问题是,当Get-ChildItem不是递归的并且-Include
只有一个过滤器时,它会被忽略!或者,我做错了(可能)。
我已经清理了输出......
PS C:\foo> Get-childitem -path "c:\foo"
Name
----
bar1.doc
bar2.doc
bar3.doc
foo1.txt
foo2.txt
foo3.txt
PS C:\foo> Get-childitem -path "c:\foo" -Include *.txt
PS C:\foo> Get-childitem -path "c:\foo" -Include *.txt -recurse
Name
----
foo1.txt
foo2.txt
foo3.txt
的sooo ???我有一个幻想,我所要做的就是分支到没有递归开关的脚本路径。 (顺便说一句,是否可以可变地应用参数以避免重复的代码路径,其中唯一的可变性是cmdlet的参数?)
无论如何,除了我的Get-ChildItem问题之外,这里还有我的完整性脚本。
function MoveFiles()
{
Get-ChildItem -Path $source -Recurse -Include $ext | where { $_.LastWriteTime -lt (Get-Date).AddDays(-$days) } | foreach {
$SourceDirectory = $_.DirectoryName;
$SourceFile = $_.FullName;
$DestinationDirectory = $SourceDirectory -replace [regex]::Escape($source), $dest;
$DestionationFile = $SourceFile -replace [regex]::Escape($source), $dest;
if ($WhatIf){
#Write-Host $SourceDirectory;
#Write-Host $DestinationDirectory;
Write-Host $SourceFile -NoNewline
Write-Host " moved to " -NoNewline
Write-Host $DestionationFile;
}
else{
if ($DestinationDirectory)
{
if ( -not [System.IO.Directory]::Exists($DestinationDirectory)) {
[void](New-Item $DestinationDirectory -ItemType directory -Force);
}
Move-Item -Path $SourceFile -Destination $DestionationFile -Force;
}
}
}
}
答案 0 :(得分:10)
答案在命令的完整描述中(get-help get-childitem -full):
Include参数有效 只有当命令包括 递归参数或路径导致 目录的内容,例如 C:\ Windows \ *,其中通配符 character指定的内容 C:\ Windows目录。
因此,如果没有递归,以下情况就会奏效。
PS C:\foo> Get-childitem -path "c:\foo\*" -Include *.txt
答案 1 :(得分:2)
这是预期的行为,但无可否认令人困惑。从Get-ChildItem帮助文件:
-Include <string[]>
仅检索指定的项目。此参数的值限定Path参数。输入路径元素或模式,例如“* .txt”。允许使用通配符。
只有当命令包含Recurse参数或路径指向目录内容时,Include参数才有效,例如C:\ Windows *,其中通配符指定C:\ Windows目录的内容。
PS&GT;帮助dir -full |更
希望这有帮助,
-Oisin
答案 2 :(得分:1)
我无法告诉你它的确切原因(但我会继续寻找),但这种行为记录在Get-ChildItem的Get-Help中:
-Include <string[]>
Retrieves only the specified items. The value of this parameter qualifies the Path parameter. Enter a path elem
ent or pattern, such as "*.txt". Wildcards are permitted.
The Include parameter is effective only when the command includes the Recurse parameter or the path leads to th
e contents of a directory, such as C:\Windows\*, where the wildcard character specifies the contents of the C:\
Windows directory.