update - Múltiples-y-en la declaración de PowerShell Where-Object
powershell windows 7 download (2)
Al ajustar sus comparaciones en {}
en su primer ejemplo, está creando ScriptBlocks; por lo que el intérprete de PowerShell lo ve como Where-Object { <ScriptBlock> -and <ScriptBlock> }
. Como el operador -and
opera en valores booleanos, PowerShell convierte los ScriptBlocks en valores booleanos. En PowerShell, todo lo que no esté vacío, cero o nulo es verdadero. La declaración luego se ve como Where-Object { $true -and $true }
que siempre es verdadero.
En lugar de usar {}
, usa paréntesis ()
.
También desea usar -eq
lugar de -match
ya que la coincidencia usa -match
regulares y será cierto si el patrón se encuentra en cualquier parte de la cadena (intente: ''xlsx'' -match ''xls''
).
Invoke-Command -computername SERVERNAME {
Get-ChildItem -path E:/dfsroots/datastore2/public |
Where-Object {($_.extension -eq ".xls" -or $_.extension -eq ".xlk") -and ($_.creationtime -ge "06/01/2014")}
}
Una mejor opción es filtrar las extensiones en el comando Get-ChildItem
.
Invoke-Command -computername SERVERNAME {
Get-ChildItem -path E:/dfsroots/datastore2/public/* -Include *.xls, *.xlk |
Where-Object {$_.creationtime -ge "06/01/2014"}
}
PS H:/> Invoke-Command -computername SERVERNAME { Get-ChildItem -path E:/dfsroots/datastore2/public} | Where-Object {{ $_.e
xtension-match "xls" -or $_.extension-match "xlk" } -and { $_.creationtime -ge "06/01/2014"}}
Arriba está mi ejemplo de código. Estoy intentando ejecutar de forma remota este código de PowerShell en mi servidor de archivos y hacer que devuelva todos los archivos .xls y .xlk con una fecha de creación posterior al 6/1/2014. Cuando ejecuto este código, comienza a escupir todas las carpetas en esa ubicación remota. Si solo comparo dos cosas así:
PS H:/> Invoke-Command -computername SERVERNAME { Get-ChildItem -path E:/dfsroots/datastore2/public} | Where-Object { $_.extension-match "xls" -and $_.creationtime -ge "06/01/2014"}
Solo se muestran los archivos xls creados en o después de esa fecha. ¿Que está pasando aqui? ¿Necesito usar otra cosa que no sea nido -and
/ -or
declaraciones?
Estás utilizando llaves cuando debes usar paréntesis.
Una declaración donde se mantiene dentro de un bloque de secuencia de comandos, que se define mediante espacios curvos { }
. Para aislar / envolver sus pruebas, debe usar paréntesis ()
.
También sugeriría tratar de hacer el filtrado en la computadora remota. Tratar:
Invoke-Command -computername SERVERNAME {
Get-ChildItem -path E:/dfsroots/datastore2/public |
Where-Object { ($_.extension -eq "xls" -or $_.extension -eq "xlk") -and $_.creationtime -ge "06/01/2014" }
}