⚠️ Advertencia crítica antes de correr cualquier script
No ejecutes este tipo de script en un ambiente de producción, carpeta real, servidor compartido, unidad de red o sistema institucional sin autorización formal.
PowerShell es una herramienta poderosa: un comando de renombrado masivo puede modificar cientos o miles de archivos en segundos. En una carpeta equivocada, eso puede causar pérdida de trazabilidad, fallos en procesos automáticos, interrupciones operativas o incidentes de ciberseguridad.
Regla obligatoria del training: primero se trabaja con data sintética, luego se valida con una muestra pequeña, después se prueba con -WhatIf cuando aplique, y solo entonces se considera ejecutar en datos reales siguiendo los protocolos de la organización.
- Permisos: usa solamente carpetas donde tengas autorización explícita.
- Backups: confirma que exista copia de seguridad o posibilidad real de recuperación.
- Cybersecurity: cumple las políticas internas, controles de acceso, change management y principios de menor privilegio.
- Producción: nunca ejecutes scripts masivos directamente sobre producción sin revisión, aprobación y plan de reversa.
⚠️ Critical warning before running any script
Do not run this type of script in a production environment, real folder, shared server, network drive, or institutional system without formal authorization.
PowerShell is a powerful tool: a bulk command can modify hundreds or thousands of files in seconds. In the wrong folder, it can break traceability, disrupt automated processes, create operational issues, or trigger cybersecurity incidents.
Mandatory training rule: start with synthetic data, validate with a small sample, test with -WhatIf when applicable, and only then consider real data while following your organization’s protocols.
- Permissions: use only folders where you have explicit authorization.
- Backups: confirm that a backup or real recovery option exists.
- Cybersecurity: follow internal policies, access controls, change management, and least-privilege principles.
- Production: never run bulk scripts directly on production without review, approval, and rollback planning.
Objetivo del Topic 5
El objetivo es detectar archivos que existen en dos carpetas diferentes usando solamente el nombre del archivo. Esto ayuda a identificar duplicados antes de copiar, mover, limpiar o consolidar información.
Topic 5 Objective
The goal is to detect files that exist in two different folders using only the file name. This helps identify duplicates before copying, moving, cleaning, or consolidating information.
Ruta de trabajo
Todo se ejecuta dentro de una carpeta controlada:
Working folder
Everything runs inside a controlled folder:
$BasePath = "$env:USERPROFILE\Documents\AI Practical Training\PowerShell\Topic 5"
Qué vamos a aprender
- Crear dos carpetas de práctica.
- Generar archivos únicos y archivos repetidos.
- Comparar nombres usando Compare-Object.
- Filtrar solo duplicados con SideIndicator -eq "==".
- Exportar un reporte simple a CSV.
What you will learn
- Create two practice folders.
- Generate unique and repeated files.
- Compare names using Compare-Object.
- Filter only duplicates with SideIndicator -eq "==".
- Export a simple report to CSV.
Script 1 — Crear data sintética en dos carpetas
Este script crea dos carpetas de práctica con algunos archivos repetidos y otros únicos. Así podemos probar la comparación sin tocar data real.
Script 1 — Create synthetic data in two folders
This script creates two practice folders with some repeated files and some unique files. This allows us to test the comparison without touching real data.
# ======================================================
# Topic 5 - Script 1
# Create synthetic folders and duplicate file names
# ======================================================
$BasePath = "$env:USERPROFILE\Documents\AI Practical Training\PowerShell\Topic 5"
$Folder1 = Join-Path $BasePath "Folder_A"
$Folder2 = Join-Path $BasePath "Folder_B"
New-Item -Path $Folder1, $Folder2 -ItemType Directory -Force | Out-Null
# Files in Folder A
$FilesA = @(
"10001.jpg",
"10002.jpg",
"10003.jpg",
"10004.jpg",
"10005.jpg",
"Only_In_A_9001.jpg",
"Only_In_A_9002.jpg"
)
# Files in Folder B
$FilesB = @(
"10003.jpg",
"10004.jpg",
"10005.jpg",
"10006.jpg",
"10007.jpg",
"Only_In_B_8001.jpg",
"Only_In_B_8002.jpg"
)
foreach ($File in $FilesA) {
New-Item -Path (Join-Path $Folder1 $File) -ItemType File -Force | Out-Null
}
foreach ($File in $FilesB) {
New-Item -Path (Join-Path $Folder2 $File) -ItemType File -Force | Out-Null
}
Write-Host "Synthetic data created in:" $BasePath
Write-Host "Folder A:"
Get-ChildItem $Folder1 | Select-Object Name
Write-Host ""
Write-Host "Folder B:"
Get-ChildItem $Folder2 | Select-Object Name
Script 2 — Detectar duplicados por nombre
Este script toma los nombres de los archivos en ambas carpetas, compara las listas y muestra solamente los nombres que existen en los dos lugares.
Script 2 — Detect duplicates by name
This script takes the file names from both folders, compares the lists, and shows only the names that exist in both locations.
# ======================================================
# Topic 5 - Script 2
# Detect duplicate file names across two folders
# ======================================================
$BasePath = "$env:USERPROFILE\Documents\AI Practical Training\PowerShell\Topic 5"
$Folder1 = Join-Path $BasePath "Folder_A"
$Folder2 = Join-Path $BasePath "Folder_B"
$Folder1Names = Get-ChildItem $Folder1 -File | Select-Object -ExpandProperty Name
$Folder2Names = Get-ChildItem $Folder2 -File | Select-Object -ExpandProperty Name
Compare-Object $Folder1Names $Folder2Names -IncludeEqual |
Where-Object { $_.SideIndicator -eq "==" } |
Select-Object @{Name="Duplicate_File_Name"; Expression={$_.InputObject}}
Script 3 — Generar reporte de duplicados
Este script crea un CSV con los duplicados encontrados para que el resultado pueda revisarse, compartirse o documentarse.
Script 3 — Generate duplicate report
This script creates a CSV file with the duplicates found so the result can be reviewed, shared, or documented.
# ======================================================
# Topic 5 - Script 3
# Export duplicate file name report
# ======================================================
$BasePath = "$env:USERPROFILE\Documents\AI Practical Training\PowerShell\Topic 5"
$Folder1 = Join-Path $BasePath "Folder_A"
$Folder2 = Join-Path $BasePath "Folder_B"
$ReportPath = Join-Path $BasePath "Duplicate_File_Names_Report.csv"
$Folder1Names = Get-ChildItem $Folder1 -File | Select-Object -ExpandProperty Name
$Folder2Names = Get-ChildItem $Folder2 -File | Select-Object -ExpandProperty Name
$Duplicates = Compare-Object $Folder1Names $Folder2Names -IncludeEqual |
Where-Object { $_.SideIndicator -eq "==" } |
ForEach-Object {
[PSCustomObject]@{
Duplicate_File_Name = $_.InputObject
Folder_A_Path = Join-Path $Folder1 $_.InputObject
Folder_B_Path = Join-Path $Folder2 $_.InputObject
}
}
$Duplicates | Export-Csv -Path $ReportPath -NoTypeInformation
Write-Host "Duplicate report created:"
Write-Host $ReportPath
$Duplicates
Explicación simple del script
- Get-ChildItem obtiene los archivos de cada carpeta.
- Select-Object -ExpandProperty Name extrae solamente el nombre.
- Compare-Object compara la lista A contra la lista B.
- -IncludeEqual permite ver los elementos iguales.
- SideIndicator -eq "==" deja solo los duplicados.
Simple script explanation
- Get-ChildItem gets the files from each folder.
- Select-Object -ExpandProperty Name extracts only the name.
- Compare-Object compares list A against list B.
- -IncludeEqual allows equal items to be shown.
- SideIndicator -eq "==" keeps only duplicates.
Ejemplo esperado
| Duplicado | Existe en |
|---|---|
| 10003.jpg | Folder_A y Folder_B |
| 10004.jpg | Folder_A y Folder_B |
| 10005.jpg | Folder_A y Folder_B |
Expected example
| Duplicate | Exists in |
|---|---|
| 10003.jpg | Folder_A and Folder_B |
| 10004.jpg | Folder_A and Folder_B |
| 10005.jpg | Folder_A and Folder_B |
Conclusión
Este topic enseña una forma rápida y simple de detectar duplicados por nombre antes de tomar acciones más fuertes. Es ideal para revisar carpetas de fotos, documentos, escaneos, cargas masivas o archivos exportados desde sistemas diferentes.
Conclusion
This topic teaches a fast and simple way to detect duplicates by name before taking stronger actions. It is ideal for reviewing folders of photos, documents, scans, bulk uploads, or files exported from different systems.