PowerShell搜索和替换

时间:2013-07-16 15:34:10

标签: search powershell

我在没有扩展名的.txt文件中有大约500个文件名。我有另一个带有完整文件名的.txt文件,其扩展名总数超过1,000。

我需要遍历较小的.txt文件并搜索更大的.txt文件中正在读取的当前行。如果找到,则将名称复制到新文件found.txt,如果不是,则转到较小的.txt文件中的下一行。

我是脚本新手,并不知道如何开始。

Get-childitem -path "C:\Users\U0146121\Desktop\Example" -recurse -name | out-file C:\Users\U0146121\Desktop\Output.txt  #send filenames to text file
(Get-Content C:\Users\U0146121\Desktop\Output.txt) |
ForEach-Object {$_  1

1 个答案:

答案 0 :(得分:1)

您的示例显示通过递归桌面上的文件夹来创建文本文件。您不需要循环文本文件;你可以使用它,但是假设你生成了一个像你所说的短名称的文本文件。

$short_file_names = Get-Content C:\Path\To\500_Short_File_Names_No_Extensions.txt

现在,您可以通过两种方式遍历该数组:

使用foreach关键字:

foreach ($file_name in $short_file_names) {
    # ...
}

或使用ForEach-Object cmdlet:

$short_file_names | ForEach-Object {
    # ...
}

最大的区别是当前项目在第一个项目中是命名变量$file_name,在第二个项目中是非命名的内置$_变量。

假设您使用的是第一个。您需要查看第二个文件中是否有$file_name,如果是,则表明您找到了它。它可以这样做。我在解释每个部分的代码中添加了注释。

# Read the 1000 names into an array variable
$full_file_names = Get-Content C:\Path\To\1000_Full_File_Names.txt

# Loop through the short file names and test each
foreach ($file_name in $short_file_names) {

    # Use the -match operator to check if the array contains the string
    # The -contains operator won't work since its a partial string match due to the extension
    # Need to escape the file name since the -match operator uses regular expressions

    if ($full_file_names -match [regex]::Escape($file_name)) {

        # Record the discovered item
        $file_name | Out-File C:\Path\To\Found.txt -Encoding ASCII -Append
    }
}