Powershell脚本,用于检查给定文件夹文件夹中是否存在文件列表中的所有文件

时间:2016-07-21 08:50:51

标签: arrays powershell directory filenames

我需要编写一个powershell脚本,输入文件名列表并检查给定的文件夹。我需要它回显如果列表中的所有文件都存在于文件夹中(如果不是,那么),反之亦然 - 是输入的文件名列表中列出的文件夹中的所有文件。

我是powershell的新手,刚刚完成了我的第一个脚本来重命名文件夹中的所有文件,我不知道如何输入列表并在检查文件夹中的文件名时迭代它。

我设法写了这样的东西:

DECLARE @String VARCHAR(100) = 'example@gmail.com'

SELECT  LEFT(@String, 1) + '*****@' 
+ REVERSE(LEFT(RIGHT(REVERSE(@String) , CHARINDEX('@', @String) +1), 1))
+ '******'
+ RIGHT(@String, 5)

我仍然需要检查相反的方式+我需要以某种方式将行从excel表转换为文件名列表

3 个答案:

答案 0 :(得分:1)

好的,我有适合我需要的代码: (文件列表在文件中给出,可以是csv)

$Dir2 = 'C:\Users\Administrator\Desktop\testDir2'
$filenames=Get-Content $Dir2\filenamesnoext.csv
foreach ($filename in $filenames) {
$found=$false; 
Get-ChildItem -Path $Dir2 -Recurse | ForEach-Object {if($filename -eq $_.BaseName) {Write-Host 'FILE ' $filename ' Ok' -foregroundcolor green; $found=$true;CONTINUE }$found=$false;} -END {if($found -ne $true){ Write-Host 'FILE ' $filename ' missing in the folder' -foregroundcolor red}}
}
Get-ChildItem -Path $Dir2 -Recurse | ForEach-Object  {$found=$false; foreach ($filename in $filenames) {if($filename -eq $_.BaseName) {Write-Host 'FILE ' $_.BaseName ' was found on the list' -foregroundcolor cyan; $found=$true;BREAK }} if($found -ne $true){ Write-Host 'FILE ' $_.BaseName ' missing on the list of files' -foregroundcolor Magenta} }

答案 1 :(得分:0)

要从文本文件中检索列表,请使用[Get-Content cmdlet]:

$FileList = Get-Content -Path .\myFileList.txt

要检索文件夹中的文件,请使用Get-ChildItem cmdlet

$Files = Get-ChildItem -Path C:\path\to\folder -File

使用Select-Object抓取文件名:

$Files = $Files |Select-Object -Property Name

最后将这两个列表与Compare-Object进行比较:

$Discrepancies = @(Compare-Object $FileList $Files)

如果Compare-Object没有返回任何内容,则两个列表之间没有任何区别:

if($Discrepancies.Count -eq 0)
{
    Write-Host "Everything is as expected!"
}

答案 2 :(得分:0)

如果有人发现它更具可读性(这里没有跳过循环迭代,仅获取文件名一次),则这里是另一个版本:

    $folder = 'D:\stuff'
    $files = @(
        "one.txt",
        "two.txt"
    )
    Write-Host "Folder: $folder."
    # Get only files and only their names
    $folderFiles = Get-ChildItem -Path $folder -Recurse -File -Name
    foreach ($f in $files) {
        if ($folderFiles -contains $f) { 
            Write-Host "File $f was found." -foregroundcolor green
        } else { 
            Write-Host "File $f was not found!" -foregroundcolor red 
        }
    }