- 当输入文件有多行时,过滤器不工作

时间:2016-12-16 15:23:14

标签: loops powershell

我有这个脚本并且它100%工作,但只适用于单个项目

我想循环脚本并从txt文件中获取内容 你看,我的scipt搜索特定文件并将其复制到具有相同文件名的现有文件夹。 所以我想要的是从2个txt文件中获取文件夹的名称和文件的名称并循环脚本

我已经设法从txt文件中获取内容,但是如果我在txt文件中添加第二行包含新值,则无法循环脚本。 我总是得到错误:

  

Get-ChildItem:无法转换' System.Object []'到类型   ' System.String'参数' Filter'需要。指定的方法是   不支持d。

好的,这是我的剧本:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
# Setup source and destination paths
$Src = '\\192.168.0.216\home\'
$Dst = 'C:\TEST\120629B\'

# Wildcard for filter
$Extension = '120629B.jpg'

# Get file objects recursively
Get-ChildItem -Path $Src -Filter $Extension -Recurse |
    # Skip directories, because XXXReadMe.txt is a valid directory name
    Where-Object {!$_.PsIsContainer} |
        # For each file
        ForEach-Object {

            # If file exist in destination folder, rename it with directory tag
            if(Test-Path -Path (Join-Path -Path $Dst -ChildPath $_.Name))
            {
                # Get full path to the file without drive letter and replace `\` with '-'
                # [regex]::Escape is needed because -replace uses regex, so we should escape '\'
                $NameWithDirTag = (Split-Path -Path $_.FullName -NoQualifier)  -replace [regex]::Escape('\'), '-'

                # Join new file name with destination directory
                $NewPath = Join-Path -Path $Dst -ChildPath $NameWithDirTag
            }
            # Don't modify new file path, if file doesn't exist in target dir
            else
            {
                $NewPath = $Dst
            }

            # Copy file
            Copy-Item -Path $_.FullName -Destination $NewPath
        }

好的,这是我改变和工作的,但只使用一个记录

$Src = '\\192.168.0.216\home\'
$Dst = Get-Content 'C:\TEST\path.txt'

# Wildcard for filter
$Extension = Get-Content 'C:\TEST\file.txt'

2 个答案:

答案 0 :(得分:0)

错误消息告诉您问题,您不能使用数组作为get-childitem的过滤器。您可以在where-object循环中嵌套foreach过滤器,但完成您尝试执行的操作的最简单方法是循环扩展过滤器,然后在其中运行循环环。所以将整个Get-ChildItem循环包装在Foreach循环中,如下所示。

Foreach($e in $extension){
  *Your Code Here*
}

对于cource,请务必将-Filter的{​​{1}}参数从Get-ChildItem更改为$Extension

答案 1 :(得分:0)

如错误所述,-Filter需要一个字符串。 Get-Content将为具有多行的文件返回一个对象数组。

由于您还在使用-Recurse,因此请考虑使用-Include代替-Filter,因为它支持叮咬数组。此应该而不更改输入文件或添加任何其他后期处理。来自[MSDN]

  

指定此cmdlet在操作中包含的一个或多个项目作为字符串数组。此参数的值限定Path参数。输入路径元素或模式,例如* .txt。允许使用通配符。

Get-ChildItem -Path $Src -Include $Extension -Recurse 

注意:

  

只有当命令包含Recurse参数或路径指向目录内容时,Include参数才有效,例如C:\ Windows *,其中通配符指定C:\ Windows目录的内容。

同样适用于-Exclude