{"id":353788,"date":"2024-09-20T13:07:18","date_gmt":"2024-09-20T13:07:18","guid":{"rendered":"https:\/\/www.ninjaone.com\/script-hub\/comprobar-la-existencia-de-archivos\/"},"modified":"2024-10-13T19:07:58","modified_gmt":"2024-10-13T19:07:58","slug":"comprobar-la-existencia-de-archivos","status":"publish","type":"script_hub","link":"https:\/\/www.ninjaone.com\/es\/script-hub\/comprobar-la-existencia-de-archivos\/","title":{"rendered":"C\u00f3mo utilizar un script PowerShell para comprobar la existencia de archivos o carpetas en Windows"},"content":{"rendered":"<p>En el panorama inform\u00e1tico moderno, la gesti\u00f3n y el mantenimiento de sistemas de archivos en numerosos servidores y estaciones de trabajo puede ser todo un reto. Los profesionales de TI, especialmente los que trabajan en <a href=\"https:\/\/www.ninjaone.com\/es\/que-es-un-msp\" target=\"_blank\" rel=\"noopener\">proveedores de servicios gestionados (MSP)<\/a>, a menudo necesitan <strong>comprobar la existencia de archivos y directorios espec\u00edficos<\/strong> para garantizar el cumplimiento, la seguridad y la eficacia operativa.<\/p>\n<p>Una forma s\u00f3lida de llevar a cabo esta tarea es mediante scripts <a href=\"https:\/\/www.ninjaone.com\/it-hub\/endpoint-management\/what-is-powershell\/\" target=\"_blank\" rel=\"noopener\">PowerShell<\/a>, que proporcionan automatizaci\u00f3n y control detallado de los entornos Windows. El script PowerShell proporcionado para comprobar la existencia de archivos est\u00e1 dise\u00f1ado para alertar a los usuarios si se encuentra un archivo o carpeta especificado dentro de un directorio o subdirectorio determinado, lo que lo convierte en una valiosa herramienta para los profesionales de TI.<\/p>\n<h2>Contexto<\/h2>\n<p>Comprobar la existencia de archivos y su ubicaci\u00f3n es crucial por varias razones. Ayuda a mantener la seguridad garantizando que no haya archivos no autorizados, apoya el cumplimiento de la normativa verificando que existan los archivos necesarios y contribuye a la eficacia operativa automatizando las comprobaciones rutinarias. Este script para comprobar la existencia de archivos es especialmente \u00fatil para los profesionales de TI que necesitan gestionar grandes redes o entornos de m\u00faltiples clientes. Al automatizar el proceso de b\u00fasqueda y alerta, se ahorra tiempo y se reduce el riesgo de error humano.<\/p>\n<h2>El script para comprobar la existencia de archivos<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">#Requires -Version 5.1\r\n\r\n&lt;#\r\n.SYNOPSIS\r\n    Alert if a specified file or folder is found in a directory or subdirectory you specify.\r\n.DESCRIPTION\r\n    Alert if a specified file or folder is found in a directory or subdirectory you specify.\r\n\r\n.EXAMPLE\r\n    -SearchPath \"C:\" -FileOrFolder \"autounattend\"\r\n\r\n    WARNING: Backslash missing from the search path. Changing it to C:\\.\r\n    [Alert] File Found.\r\n    C:\\Users\\Administrator\\Desktop\\ExampleFolder\\Test Folder 1\\autounattend.xml\r\n    C:\\Users\\Administrator\\Desktop\\ExampleFolder\\Test Folder 2\\autounattend.xml\r\n    C:\\Users\\Administrator\\Desktop\\ExampleFolder\\TestFolder1\\Test Folder 1\\autounattend.xml\r\n    C:\\Users\\Administrator\\Desktop\\ExampleFolder\\TestFolder1\\Test Folder 2\\autounattend.xml\r\n    C:\\Users\\Administrator\\Desktop\\ExampleFolder\\TestFolder2\\Test Folder 1\\TestFolder1\\autounattend.xml\r\n    Attempting to set Custom Field 'multiline'.\r\n    Successfully set Custom Field 'multiline'!\r\n\r\nPARAMETER: -SeachPath \"C:\\ReplaceMeWithAvalidPath\"\r\n    Enter the starting directories for the search, separated by commas. This will include all subdirectories as well.\r\n\r\nPARAMETER: -FileOrFolder \"ReplaceMeWithNameToSearchFor\"\r\n    Specify the full or partial name of a file or folder to find. E.g., 'config' or '.exe'.\r\n\r\nPARAMETER: -SearchType \"Files and Folders\"\r\n    Limit the search to either files, folders, or both.\r\n\r\nPARAMETER: -Timeout \"30\"\r\n    Maximum search time in minutes, halts search if exceeded.\r\n\r\nPARAMETER: -CustomField \"ReplaceMeWithNameOfMultilineCustomField\"\r\n    Optional multiline field to record search results. Leave blank if unused.\r\n\r\n.NOTES\r\n    Minimum OS Architecture Supported: Windows 10, Windows Server 2016\r\n    Release Notes: Initial Release\r\nBy using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https:\/\/www.ninjaone.com\/terms-of-use.\r\n    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. \r\n    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. \r\n    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. \r\n    Warranty Disclaimer: The script is provided \u201cas is\u201d and \u201cas available\u201d, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. \r\n    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. \r\n    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. \r\n    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).\r\n#&gt;\r\n\r\n[CmdletBinding()]\r\nparam (\r\n    [Parameter()]\r\n    [String]$SearchPath = \"C:\\Windows,C:\\Program Files\",\r\n    [Parameter()]\r\n    [String]$FileOrFolder,\r\n    [Parameter()]\r\n    [String]$SearchType = \"Files and Folders\",\r\n    [Parameter()]\r\n    [Int]$Timeout = 30,\r\n    [Parameter()]\r\n    [String]$CustomField\r\n)\r\n\r\nbegin {\r\n    # Set parameters using dynamic script variables.\r\n    if ($env:searchPath -and $env:searchPath -notlike \"null\") { $SearchPath = $env:searchPath }\r\n    if ($env:fileNameOrFolderNameToSearchFor -and $env:fileNameOrFolderNameToSearchFor -notlike \"null\") { $FileOrFolder = $env:fileNameOrFolderNameToSearchFor }\r\n    if ($env:searchType -and $env:searchType -notlike \"null\") { $SearchType = $env:searchType }\r\n    if ($env:timeoutInMinutes -and $env:timeoutInMinutes -notlike \"null\") { $Timeout = $env:timeoutInMinutes }\r\n    if ($env:customFieldName -and $env:customFieldName -notlike \"null\") { $CustomField = $env:customFieldName }\r\n\r\n    # Error out if no search path was given.\r\n    if (-not $SearchPath) {\r\n        Write-Host \"[Error] No search path given!\"\r\n        exit 1\r\n    }\r\n\r\n    # If given a comma-separated list, split the paths.\r\n    $PathsToSearch = New-Object System.Collections.Generic.List[String]\r\n    if ($SearchPath -match \",\") {\r\n        $SearchPath -split \",\" | ForEach-Object { $PathsToSearch.Add($_.Trim()) }\r\n    }\r\n    else {\r\n        $PathsToSearch.Add($SearchPath)\r\n    }\r\n\r\n    # Initialize a generic list for paths to remove or replace.\r\n    $ReplacementPaths = New-Object System.Collections.Generic.List[Object]\r\n    $PathsToRemove = New-Object System.Collections.Generic.List[String]\r\n\r\n    # If given a drive without the backslash add it in.\r\n    $PathsToSearch | ForEach-Object {\r\n        if ($_ -notmatch '^[A-Z]:\\\\$' -and $_ -match '^[A-Z]:$') {\r\n            $NewPath = \"$_\\\"\r\n            $ReplacementPaths.Add(\r\n                [PSCustomObject]@{\r\n                    Index   = $PathsToSearch.IndexOf(\"$_\")\r\n                    NewPath = $NewPath\r\n                }\r\n            )\r\n                \r\n            Write-Warning \"Backslash missing from the search path. Changing it to $NewPath.\"\r\n        }\r\n    }\r\n\r\n    # Apply replacements.\r\n    $ReplacementPaths | ForEach-Object {\r\n        $PathsToSearch[$_.index] = $_.NewPath \r\n    }\r\n\r\n    # Check if the search path is valid.\r\n    $PathsToSearch | ForEach-Object {\r\n        if (-not (Test-Path $_)) {\r\n            Write-Host -Object \"[Error] $_ does not exist!\"\r\n            $PathsToRemove.Add($_)\r\n            $ExitCode = 1\r\n        }\r\n    }\r\n\r\n    # Remove Paths that do not exist.\r\n    $PathsToRemove | ForEach-Object {\r\n        $PathsToSearch.Remove($_) | Out-Null\r\n    }\r\n\r\n    # Error out if no valid paths to search.\r\n    if ($($PathsToSearch).Count -eq 0) {\r\n        Write-Host \"[Error] No valid paths to search!\"\r\n        exit 1\r\n    }\r\n\r\n    # If we're not given a file or folder error out.\r\n    if (-not $FileOrFolder) {\r\n        Write-Host -Object \"[Error] No file or folder given to search for!\"\r\n        exit 1\r\n    }\r\n\r\n    # Timeout must be within a given range in minutes.\r\n    if ($Timeout -lt 1 -or $Timeout -gt 120) {\r\n        Write-Host -Object \"[Error] Timeout is greater than 120 minutes or less than 1 minute.\"\r\n        exit 1\r\n    }\r\n\r\n    # Scope the search to either files only or folders only.\r\n    $ValidSearchTypes = \"Files and Folders\", \"Files Only\", \"Folders Only\"\r\n    if ($ValidSearchTypes -notcontains $SearchType) {\r\n        Write-Host -Object \"[Error] Invalid search type.\"\r\n        exit 1\r\n    }\r\n\r\n    # Test for local administrator rights.\r\n    function Test-IsElevated {\r\n        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()\r\n        $p = New-Object System.Security.Principal.WindowsPrincipal($id)\r\n        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)\r\n    }\r\n\r\n    # Handy function to set a custom field.\r\n    function Set-NinjaProperty {\r\n        [CmdletBinding()]\r\n        Param(\r\n            [Parameter(Mandatory = $True)]\r\n            [String]$Name,\r\n            [Parameter()]\r\n            [String]$Type,\r\n            [Parameter(Mandatory = $True, ValueFromPipeline = $True)]\r\n            $Value,\r\n            [Parameter()]\r\n            [String]$DocumentName\r\n        )\r\n    \r\n        $Characters = $Value | Measure-Object -Character | Select-Object -ExpandProperty Characters\r\n        if ($Characters -ge 10000) {\r\n            throw [System.ArgumentOutOfRangeException]::New(\"Character limit exceeded, value is greater than 10,000 characters.\")\r\n        }\r\n        \r\n        # If we're requested to set the field value for a Ninja document we'll specify it here.\r\n        $DocumentationParams = @{}\r\n        if ($DocumentName) { $DocumentationParams[\"DocumentName\"] = $DocumentName }\r\n        \r\n        # This is a list of valid fields that can be set. If no type is given, it will be assumed that the input doesn't need to be changed.\r\n        $ValidFields = \"Attachment\", \"Checkbox\", \"Date\", \"Date or Date Time\", \"Decimal\", \"Dropdown\", \"Email\", \"Integer\", \"IP Address\", \"MultiLine\", \"MultiSelect\", \"Phone\", \"Secure\", \"Text\", \"Time\", \"URL\", \"WYSIWYG\"\r\n        if ($Type -and $ValidFields -notcontains $Type) { Write-Warning \"$Type is an invalid type! Please check here for valid types. https:\/\/ninjarmm.zendesk.com\/hc\/en-us\/articles\/16973443979789-Command-Line-Interface-CLI-Supported-Fields-and-Functionality\" }\r\n        \r\n        # The field below requires additional information to be set\r\n        $NeedsOptions = \"Dropdown\"\r\n        if ($DocumentName) {\r\n            if ($NeedsOptions -contains $Type) {\r\n                # We'll redirect the error output to the success stream to make it easier to error out if nothing was found or something else went wrong.\r\n                $NinjaPropertyOptions = Ninja-Property-Docs-Options -AttributeName $Name @DocumentationParams 2&gt;&amp;1\r\n            }\r\n        }\r\n        else {\r\n            if ($NeedsOptions -contains $Type) {\r\n                $NinjaPropertyOptions = Ninja-Property-Options -Name $Name 2&gt;&amp;1\r\n            }\r\n        }\r\n        \r\n        # If an error is received it will have an exception property, the function will exit with that error information.\r\n        if ($NinjaPropertyOptions.Exception) { throw $NinjaPropertyOptions }\r\n        \r\n        # The below type's require values not typically given in order to be set. The below code will convert whatever we're given into a format ninjarmm-cli supports.\r\n        switch ($Type) {\r\n            \"Checkbox\" {\r\n                # While it's highly likely we were given a value like \"True\" or a boolean datatype it's better to be safe than sorry.\r\n                $NinjaValue = [System.Convert]::ToBoolean($Value)\r\n            }\r\n            \"Date or Date Time\" {\r\n                # Ninjarmm-cli expects the  Date-Time to be in Unix Epoch time so we'll convert it here.\r\n                $Date = (Get-Date $Value).ToUniversalTime()\r\n                $TimeSpan = New-TimeSpan (Get-Date \"1970-01-01 00:00:00\") $Date\r\n                $NinjaValue = $TimeSpan.TotalSeconds\r\n            }\r\n            \"Dropdown\" {\r\n                # Ninjarmm-cli is expecting the guid of the option we're trying to select. So we'll match up the value we were given with a guid.\r\n                $Options = $NinjaPropertyOptions -replace '=', ',' | ConvertFrom-Csv -Header \"GUID\", \"Name\"\r\n                $Selection = $Options | Where-Object { $_.Name -eq $Value } | Select-Object -ExpandProperty GUID\r\n        \r\n                if (-not $Selection) {\r\n                    throw [System.ArgumentOutOfRangeException]::New(\"Value is not present in dropdown\")\r\n                }\r\n        \r\n                $NinjaValue = $Selection\r\n            }\r\n            default {\r\n                # All the other types shouldn't require additional work on the input.\r\n                $NinjaValue = $Value\r\n            }\r\n        }\r\n        \r\n        # We'll need to set the field differently depending on if its a field in a Ninja Document or not.\r\n        if ($DocumentName) {\r\n            $CustomField = Ninja-Property-Docs-Set -AttributeName $Name -AttributeValue $NinjaValue @DocumentationParams 2&gt;&amp;1\r\n        }\r\n        else {\r\n            $CustomField = Ninja-Property-Set -Name $Name -Value $NinjaValue 2&gt;&amp;1\r\n        }\r\n        \r\n        if ($CustomField.Exception) {\r\n            throw $CustomField\r\n        }\r\n    }\r\n\r\n    $ExitCode = 0\r\n}\r\nprocess {\r\n    # Error out if local administrator rights are not present.\r\n    if (-not (Test-IsElevated)) {\r\n        Write-Host \"[Error] Access Denied. Please run with Administrator privileges.\"\r\n        exit 1\r\n    }\r\n\r\n    # Initialize generic lists.\r\n    $SearchJobs = New-Object System.Collections.Generic.List[object]\r\n    $CustomFieldValue = New-Object System.Collections.Generic.List[string]\r\n\r\n    # For each given path to search, create a PowerShell job with the provided parameters.\r\n    $PathsToSearch | ForEach-Object {\r\n        $SearchJobs.Add(\r\n            (\r\n                Start-Job -ScriptBlock {\r\n                    param($SearchPath, $FileOrFolder, $SearchType)\r\n                    # We're going to wildcard search either files or folders depending on the parameters given.\r\n                    switch ($SearchType) {\r\n                        \"Files and Folders\" {\r\n                            Get-ChildItem -Path $SearchPath -Filter \"*$FileOrFolder*\" -Recurse | Select-Object -Property FullName, Attributes | ConvertTo-Csv\r\n                        }\r\n                        \"Folders Only\" {\r\n                            Get-ChildItem -Path $SearchPath -Filter \"*$FileOrFolder*\" -Recurse -Directory | Select-Object -Property FullName, Attributes | ConvertTo-Csv\r\n                        }\r\n                        \"Files Only\" { \r\n                            Get-ChildItem -Path $SearchPath -Filter \"*$FileOrFolder*\" -Recurse -File | Select-Object FullName, Attributes | ConvertTo-Csv\r\n                        }\r\n                    }\r\n                } -ArgumentList $_, $FileOrFolder, $SearchType\r\n            )\r\n        )\r\n    }\r\n\r\n    # Convert timeout to seconds as Wait-Job requires seconds.\r\n    $TimeoutInSeconds = $Timeout * 60\r\n    $StartTime = Get-Date\r\n\r\n    # Wait for all jobs to complete or timeout.\r\n    foreach ($SearchJob in $SearchJobs) {\r\n        # Calculate the remaining time.\r\n        $TimeElapsed = (Get-Date) - $StartTime\r\n        $RemainingTime = $TimeoutInSeconds - $TimeElapsed.TotalSeconds\r\n    \r\n        # If there is no remaining time, break the loop.\r\n        if ($RemainingTime -le 0) {\r\n            break\r\n        }\r\n    \r\n        # Wait for the current job with the remaining time as the timeout.\r\n        $SearchJob | Wait-Job -Timeout $RemainingTime | Out-Null\r\n    }\r\n\r\n    # Output a warning if the job fails to complete.\r\n    $IncompleteJobs = $SearchJobs | Get-Job | Where-Object { $_.State -eq \"Running\" }\r\n    if ($IncompleteJobs) {\r\n        Write-Host \"[Error] The timeout period of $Timeout minutes has been reached, but not all files or directories have been searched!\"\r\n        $CustomFieldValue.Add(\"[Error] The timeout period of $Timeout minutes has been reached, but not all files or directories have been searched!\")\r\n        $ExitCode = 1\r\n    }\r\n\r\n    # Our PowerShell Job outputs in CSV format; we'll convert it here.\r\n    $MatchingItems = $SearchJobs | ForEach-Object {\r\n        $_ | Get-Job | Receive-Job -ErrorAction SilentlyContinue -ErrorVariable JobErrors | ConvertFrom-Csv\r\n    }\r\n\r\n    # Identify whether or not we have a match for a file or folder here.\r\n    $FileMatch = $MatchingItems | Where-Object { $_.Attributes -ne \"Directory\" }\r\n    $FolderMatch = $MatchingItems | Where-Object { $_.Attributes -eq \"Directory\" }\r\n\r\n    # If we have a match for a file we'll output that here.\r\n    if ($FileMatch) { \r\n        Write-Host -Object \"[Alert] File Found.\"\r\n        $CustomFieldValue.Add(\"[Alert] File Found.\")\r\n    }\r\n\r\n    # If we have a match for a folder we'll output that here.\r\n    if ($FolderMatch) { \r\n        Write-Host -Object \"[Alert] Folder Found.\" \r\n        $CustomFieldValue.Add(\"[Alert] Folder Found.\")\r\n    }\r\n\r\n    # If we have no matches we'll output that here.\r\n    if (-not $FileMatch -and -not $FolderMatch) {\r\n        Write-Host -Object \"Unable to find $FileOrFolder.\"\r\n        $CustomFieldValue.Add(\"Unable to find $FileOrFolder.\")\r\n    }\r\n\r\n    # For each matching file we'll output their full path.\r\n    $MatchingItems | ForEach-Object { \r\n        Write-Host \"$($_.FullName)\"\r\n        $CustomFieldValue.Add(\"$($_.FullName)\") \r\n    }\r\n\r\n    # Output any failures or errors received.\r\n    $FailedJobs = $SearchJobs | Get-Job | Where-Object { $_.State -ne \"Completed\" -and $_.State -ne \"Running\" }\r\n    if ($FailedJobs -or $JobErrors) {\r\n        Write-Host \"\"\r\n        Write-Host \"[Error] Failed to search certain files or directories due to an error.\"\r\n\r\n        $CustomFieldValue.Add(\"\")\r\n        $CustomFieldValue.Add(\"[Error] Failed to search certain files or directories due to an error.\")\r\n        if ($JobErrors) {\r\n            Write-Host \"\"\r\n            $CustomFieldValue.Add(\"\")\r\n\r\n            $JobErrors | ForEach-Object { \r\n                Write-Host \"[Error] $($_.Exception.Message)\" \r\n                $CustomFieldValue.Add(\"[Error] $($_.Exception.Message)\")\r\n            }\r\n        }\r\n        $ExitCode = 1\r\n    }\r\n\r\n    $SearchJobs | Get-Job | Remove-Job -Force\r\n\r\n    # Attempt to set the custom field using the Set-NinjaProperty function, if provided.\r\n    if ($CustomField) {\r\n        try {\r\n            Write-Host \"Attempting to set Custom Field '$CustomField'.\"\r\n            Set-NinjaProperty -Name $CustomField -Value ($CustomFieldValue | Out-String)\r\n            Write-Host \"Successfully set Custom Field '$CustomField'!\"\r\n        }\r\n        catch {\r\n            if (-not $_.Exception.Message) {\r\n                Write-Host \"[Error] $($_.Message)\"\r\n            }\r\n            else {\r\n                Write-Host \"[Error] $($_.Exception.Message)\"\r\n            }\r\n            $ExitCode = 1\r\n        }\r\n    }\r\n\r\n    exit $ExitCode\r\n}\r\nend {\r\n    \r\n    \r\n    \r\n}<\/pre>\n<p>&nbsp;<\/p>\n\n<div class=\"blog-cta-new blog-cta-style-1\"><div class=\"cta-left\"><h2><\/h2><p><\/p><\/div><div class=\"cta-right\"><a class=\"button\" href=\"\"><\/a><\/div><\/div>\n<h2>An\u00e1lisis detallado<\/h2>\n<p>El script para comprobar la existencia de archivos funciona en varias etapas, cada una de las cuales contribuye a su funcionalidad general. Aqu\u00ed tienes un desglose paso a paso:<\/p>\n<p><strong>1. Inicializaci\u00f3n de par\u00e1metros<\/strong>: el script comienza definiendo varios par\u00e1metros:<\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"2\">SearchPath: los directorios en los que buscar.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"2\" data-aria-level=\"2\">FileOrFolder: el nombre del archivo o carpeta a buscar.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"3\" data-aria-level=\"2\">SearchType: si se buscan archivos, carpetas o ambos.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"4\" data-aria-level=\"2\">Timeout: duraci\u00f3n m\u00e1xima de la b\u00fasqueda.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"5\" data-aria-level=\"2\">CustomField: campo opcional para registrar los resultados de la b\u00fasqueda.<\/li>\n<\/ul>\n<p><strong>2. Variables de entorno: <\/strong>el script para comprobar la existencia de archivos comprueba si hay alguna variable de entorno configurada que deba anular los par\u00e1metros de entrada. Esto permite realizar ajustes din\u00e1micos en funci\u00f3n de los distintos entornos.<\/p>\n<p><strong>3. Validaci\u00f3n<\/strong>: el script realiza varias comprobaciones de validaci\u00f3n:<\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"6\" data-aria-level=\"2\">Se asegura de que se proporciona una ruta de b\u00fasqueda.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"7\" data-aria-level=\"2\">Valida y formatea la ruta de b\u00fasqueda.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"8\" data-aria-level=\"2\">Comprueba la existencia de las rutas especificadas.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"9\" data-aria-level=\"2\">Valida el nombre del archivo o carpeta.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"10\" data-aria-level=\"2\">Se asegura de que el valor del tiempo de espera est\u00e1 dentro de un rango aceptable.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"11\" data-aria-level=\"2\">Confirma que el tipo de b\u00fasqueda es v\u00e1lido.<\/li>\n<\/ul>\n<p><strong>4. Comprobaci\u00f3n de derechos de administrador<\/strong>: el script para comprobar la existencia de archivos incluye una funci\u00f3n para verificar si se est\u00e1 ejecutando con privilegios de administrador, lo cual es necesario para ciertas operaciones con archivos.<\/p>\n<p><strong>5. Ejecuci\u00f3n de la b\u00fasqueda<\/strong>: la funcionalidad principal consiste en crear tareas PowerShell para cada ruta que se quiera buscar. Estas tareas realizan b\u00fasquedas recursivas basadas en los par\u00e1metros especificados y devuelven los resultados en formato CSV.<\/p>\n<p><strong>6. Gesti\u00f3n de resultados<\/strong>: el script recoge y procesa los resultados de la b\u00fasqueda:<\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"12\" data-aria-level=\"2\">Identifica coincidencias de archivos y carpetas.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"13\" data-aria-level=\"2\">Muestra las rutas completas de los elementos coincidentes.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"14\" data-aria-level=\"2\">Registra errores o b\u00fasquedas incompletas.<\/li>\n<\/ul>\n<p><strong>7. Configuraci\u00f3n de campo personalizada<\/strong>: si se especifica un campo personalizado, el script intenta establecerlo con los resultados de la b\u00fasqueda, aprovechando una funci\u00f3n de ayuda para manejar diferentes tipos de campo.<\/p>\n<p><strong>8. Tratamiento de errores y limpieza<\/strong>: el script se asegura de que se registra cualquier error y de que todos los trabajos se limpian correctamente antes de salir con un c\u00f3digo de salida apropiado.<\/p>\n<h2>Posibles casos de uso<\/h2>\n<p>Imaginemos que un profesional de TI gestiona una red de estaciones de trabajo para un cliente corporativo. Necesita asegurarse de que no hay archivos ejecutables no autorizados en los directorios de usuario, como parte de una auditor\u00eda de seguridad. Al desplegar este script para comprobar la existencia de archivos, puede automatizar la b\u00fasqueda en todas las estaciones de trabajo, identificando r\u00e1pidamente cualquier instancia de archivos no autorizados y tomando las medidas necesarias. Esta automatizaci\u00f3n no s\u00f3lo mejora la seguridad, sino que tambi\u00e9n libera un tiempo valioso para que el equipo de TI se centre en tareas m\u00e1s estrat\u00e9gicas.<\/p>\n<h2>Comparaciones<\/h2>\n<p>Este script para comprobar la existencia de archivos proporciona un enfoque exhaustivo y automatizado de las b\u00fasquedas de archivos y carpetas en comparaci\u00f3n con los m\u00e9todos manuales o los scripts por lotes b\u00e1sicos. Los m\u00e9todos tradicionales suelen implicar la navegaci\u00f3n manual por directorios o el uso de scritps sencillos que carecen de funciones avanzadas como la gesti\u00f3n del tiempo de espera, el registro de campos personalizados y la ejecuci\u00f3n de trabajos multihilo. La capacidad del script PowerShell para manejar entornos complejos y proporcionar resultados detallados lo convierte en una opci\u00f3n superior para los profesionales de TI.<\/p>\n<h2>FAQ<\/h2>\n<h3>1) \u00bfC\u00f3mo puedo especificar varios directorios para la b\u00fasqueda?<\/h3>\n<p>Utiliza una lista separada por comas para el par\u00e1metro SearchPath, por ejemplo, \u00abC:Path1,C:Path2\u00bb.<\/p>\n<h3>2) \u00bfPuedo limitar la b\u00fasqueda s\u00f3lo a archivos o s\u00f3lo a carpetas?<\/h3>\n<p>S\u00ed. Utiliza el par\u00e1metro SearchType con los valores \u00abFiles Only\u00bb o \u00abFolders Only\u00bb.<\/p>\n<h3>3) \u00bfQu\u00e9 ocurre si la b\u00fasqueda supera el tiempo de espera especificado?<\/h3>\n<p>El script para comprobar la existencia de archivos finalizar\u00e1 cualquier b\u00fasqueda incompleta y registrar\u00e1 un mensaje de error.<\/p>\n<h3>4) \u00bfNecesito privilegios de administrador para ejecutar este script?<\/h3>\n<p>S\u00ed, el script comprueba si tienes derechos de administrador y saldr\u00e1 si no se ejecuta con privilegios suficientes.<\/p>\n<h2>Implicaciones<\/h2>\n<p>Los resultados de este script para comprobar la existencia de archivos tienen importantes implicaciones para la seguridad inform\u00e1tica. Al identificar archivos y carpetas no autorizados o extraviados, los profesionales de TI pueden tomar medidas inmediatas para mitigar los posibles riesgos de seguridad. La ejecuci\u00f3n peri\u00f3dica de este script como parte de una rutina de mantenimiento puede ayudar a garantizar el cumplimiento de las pol\u00edticas organizativas y los requisitos normativos, mejorando as\u00ed la postura de seguridad general.<\/p>\n<h2>Recomendaciones<\/h2>\n<p>Cuando utilices este script para comprobar la existencia de archivos, ten en cuenta las siguientes pr\u00e1cticas recomendadas:<\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"2\" data-aria-level=\"1\">Actualiza peri\u00f3dicamente el script para adaptarlo a los cambios de tu entorno.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"3\" data-aria-level=\"1\">Integra el script en rutinas de mantenimiento automatizadas.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"4\" data-aria-level=\"1\">Revisa los resultados de la b\u00fasqueda y act\u00faa con rapidez para mantener la seguridad.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"5\" data-aria-level=\"1\">Personaliza los par\u00e1metros del script para adaptarlos a necesidades y entornos espec\u00edficos.<\/li>\n<\/ul>\n<h2>Reflexiones finales<\/h2>\n<p>Este script de PowerShell es una potente herramienta para los profesionales de TI, ya que proporciona funciones automatizadas y eficaces de b\u00fasqueda de archivos y carpetas. Gracias a este script para comprobar la existencia de archivos, los equipos inform\u00e1ticos pueden mejorar su <a href=\"https:\/\/www.ninjaone.com\/es\/eficiencia\/\" target=\"_blank\" rel=\"noopener\">eficacia operativa<\/a>, <a href=\"https:\/\/www.ninjaone.com\/es\/?page_id=310645\" target=\"_blank\" rel=\"noopener\">mantener la seguridad<\/a> y garantizar el cumplimiento de las pol\u00edticas de la organizaci\u00f3n. Para aquellos que utilizan NinjaOne, la integraci\u00f3n de este script puede agilizar a\u00fan m\u00e1s las tareas de gesti\u00f3n, lo que permite el control centralizado y la supervisi\u00f3n en m\u00faltiples endpoints.<\/p>\n","protected":false},"author":35,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_lmt_disableupdate":"","_lmt_disable":""},"operating_system":[4212],"use_cases":[4263],"class_list":["post-353788","script_hub","type-script_hub","status-publish","hentry","script_hub_category-windows"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub\/353788","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub"}],"about":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/types\/script_hub"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/comments?post=353788"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/media?parent=353788"}],"wp:term":[{"taxonomy":"script_hub_category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/operating_system?post=353788"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/use_cases?post=353788"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}