我的文件夹中有很多文件,我想检查该文件是否存在并与我初始化的变量匹配。然后,如果文件退出并匹配,我想从文件(许多文件)中获取一些信息,然后根据存在并匹配的文件数创建一个新文件。
我尝试了此代码,可以检查匹配的文件和现有文件。我可以创建一个新文件并从文件中获取信息,但是我只能创建1个文件。 我从文件中获得的信息,每个文件都是不同的。
$ID = "123"
$Pre = "ABC"
$Path = "C:\Folder"
$PO = Get-ChildItem -Path $Path
foreach ($File in $PO) {
if (($File.Name -match $ID) -and ($File.Name -match $Pre)) {
Write-Host ">>POfile Found: $File"
} else {
Write-Host ">>Check Again!"
}
}
# CREATE FILE
$Jb_Path = "C:\Folder\Jb"
## GET INFORMATION
$count = 1
$Get_PO = Get-ChildItem -Path $Path\$File -File -Recurse
$POfile = Get-Random -InputObject $Get_PO -Count $count
Write-Host ">>Selected POfile= $POfile"
$FilteredContents = Get-Content $POfile | Where-Object {$_ -like "*;INFO*"}
$Get_INFO = $FilteredContents.Substring(5,2)
## NEW FILE
New-Item -Path $Jb_Path\NEW_$Pre$ID-$Get_INFO.txt -Force
答案 0 :(得分:0)
在# CREATE FILE
部分中,您引用的变量$File
在上一个foreach中具有最后一个迭代的值(即使它与if条件不匹配)。
假设$Pre
是前缀,并且在文件名中排在首位,只需执行
Get-ChildItem "$Path\*$Pre*$ID*"只获取符合您条件的文件名。
由于$ File仅包含一个文件名,因此Get-Random没有意义,尤其是因为它可能不包含带有;INFO
假设要提取的两个字符在;INFO
前面,那么未经测试的脚本可能会这样做:
$Pre = "ABC"
$ID = "123"
$Path = "C:\Folder"
$Jb_Path= "C:\Folder\Jb"
Get-ChildItem "$Path\*$Pre*$ID*" | Get-Content |
Select-String -Pattern '^.....(..).*;INFO' |
Get-Random | ForEach-Object {
$NewFile = Join-Path $Jb_Path ('NEW_{0}{1}-{2}.txt' -f $Pre,
$ID,$_.Matches.Groups[1].Value)
New-Item -Path $NewFile -ItemType File -Force -WhatIf
}
它只会输出没有-WhatIf
参数的情况。
如果没有找到符合条件和RegEx模式的文件,它将以静默方式继续。
如果我的假设使我错了,请通过编辑更多细节来完善您的问题。