Pregunta Diferentes resultados entre "PowerShell ISE" y "Ejecutar con PowerShell"


Tengo dos "guiones" simples de una línea. Verifican la antigüedad de ciertos archivos en ciertas carpetas. Uno muestra el resultado en la pantalla y el otro escribe el resultado en un archivo de texto en el escritorio. Ambos archivos de script ".ps1" se guardan en el escritorio. Ejecutar archivos ".ps1" usando "Ejecutar con PowerShell" obtiene resultados que no son correctos. Cuando se ejecutan archivos ".ps1" a través de PowerShell ISE, el resultado es diferente (y correcto).

El primer guion:

cd G:\moveh\back
Get-ChildItem -filter "*.rar" | Foreach-Object {  if ( ((get-date).toshortdatestring() ) -gt ($_.lastwritetime.toshortdatestring() )  ) { "{0}   {1}" -f $_.name,$_.lastwritetime.toshortdatestring()} }

cmd /c pause

El segundo guion:

Get-ChildItem $allfolders | where {$_.Name -notlike "*closed"} | gci -   Recurse -File -filter "Data.rar" | where {( ($_.lastwritetime.toshortdatestring()) -lt ((get-date).AddDays(-1).ToShortDateString() ) ) } | format-table -autosize -Property Directory, Name, LastWriteTime > C:\Users\itsupport\Desktop\Files_2b_updated_DB.txt

Una captura de pantalla de ejemplo con los dos resultados diferentes para el primer guión:

1

¿Alguna idea de por qué hay diferentes resultados?


1


origen




Respuestas:


Estás lanzando fechas a cadenas y está produciendo resultados diferentes en ISE y consola de PowerShell.

Mira tu from073.rar archivo:

  • Fecha ISE: 10/05/ 2015
  • Fecha de la consola de PowerShell: 5/10/ 2015

Es mejor que te deshagas de .ToShortDateString() y compare las fechas directamente. Ver esta pregunta: Powershell: Comparando fechas

Aunque las cadenas se presentan de forma diferente en ISE y en   Consola PowerShell la comparación es de manzanas a manzanas, por lo que los resultados   debería ser lo mismo.

Sí, pero tu "manzanas" en este caso son códigos de caracteres, que estoy seguro de que no es lo que quería comparar. Ejemplo:

  • 'a' -gt 'b' es false, porque el código de carácter de a es menor que el código de carácter de b.

  • 'ac' -gt 'ab' es true, porque el código de carácter de a es lo mismo para las dos cadenas, pero el siguiente código de carácter de la cadena izquierda (c) es mayor que el segundo código de carácter de la cadena derecha (b)

Entonces, cuando ejecuta su código en ISE que usa dd/mm/yyyy formato, su código solo compara primero dd parte e ignora mm/yyyyporque pasa a ser lo mismo Y está obteniendo resultados correctos por puro accidente. En el formato de fecha de la consola PowerShell es mm/dd/yyyy, entonces tu código se rompe como debería.

Esta es mi nueva línea:

Get-ChildItem -filter "*.rar" |
    Foreach-Object {
        if((get-date $_.lastwritetime -Format d) -lt (Get-Date -Format d ))
        {
            "{0} {1}" -f $_.name, (get-date $_.lastwritetime -Format d)
        }
    }

Pero la comparación no está funcionando.

Aquí tienes otra vez: estás usando -Format d, que convierte el objeto de fecha en cadena. Y ya sabes a qué conduce.

Si desea obtener archivos anteriores a un día, su código debería verse así (observe, cómo dos Fecha y hora objetos comparados directamente, sin cadenas involucradas):

Get-ChildItem -Filter '*.rar' |
        Foreach-Object {
            if($_.LastWriteTime -lt (Get-Date).AddDays(-1))
            {
                '{0} {1}' -f $_.Name, $_.LastWriteTime
            }
        } 

1



Tengo dos preguntas de seguimiento: 1) Aunque las cadenas se presentan de forma diferente en ISE y en la consola de PowerShell, la comparación es de manzanas a manzanas, por lo que los resultados deberían ser los mismos. En la captura de pantalla anterior, en ISE, la salida muestra nombres de archivo que no se muestran en la consola de PowerShell y viceversa. ¿Porqué es eso? - eliko
2. Esta es mi nueva línea: Get-ChildItem -filter "*.rar" | Foreach-Object { if ( (get-date $_.lastwritetime -Format d) -lt (Get-Date -Format d )) { "{0} {1}" -f $_.name, (get-date $_.lastwritetime -Format d)} }  Pero la comparación no está funcionando. Creé una carpeta de prueba con 10 archivos. El resultado de la comparación no incluye archivos que son más antiguos que un día. Por favor ver ejemplo de captura de pantalla - eliko
@eliko Ver respuesta actualizada. - beatcracker