首页 > 解决方案 > 如何根据 PowerShell 中的现有变量自动创建新文件?

问题描述

我在一个文件夹中有很多文件,我想用我初始化的变量检查文件的现有和匹配。然后,如果文件退出并匹配,我想从文件(许多文件)中获取一些信息,然后根据存在和匹配的文件数量创建一个新文件。

我试过这段代码,我可以检查匹配的和现有的文件。我可以创建一个新文件并从文件中获取信息,但我只能创建一个文件。我从文件中得到的信息,每个文件都不一样。

$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

标签: powershell

解决方案


  • 在该部分# 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 模式的文件,它将默默地继续。

如果我的假设导致我出错,请通过更多细节来增强您的问题。


推荐阅读