我有这个脚本并且它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'
答案 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