Powershell: Por que esse loop foreach não será gerado?

Powershell: Por que esse loop foreach não será gerado?

Eu tenho o seguinte script simples:

write-output "Calculating Mod Dates . . ."
$path = 'C:\Users\Server\SERVER\Online'
$files = Get-ChildItem -Path '$path' -include "*"
foreach ($file in $files) {
    $ModDate = Get-Item $importfile | Foreach {$_.LastWriteTime}
    $CurrentDate = Get-Date
    $differece = ($CurrentDate - $ModDate).TotalSeconds
    write-output "$importfile - $differece seconds ago."
}

No entanto, embora o primeiro write-outputcomando funcione, o segundo não. Por que é isso?

Responder1

Você usou incorretamente aspas simples na terceira linha: '$path' é avaliado como uma string literal $path, que provavelmente não é um caminho real.

Responder2

Abordagem de sessão de depuração de Poorman - usando o ISE e/ou VSCode

Você tem erros de sintaxe e outras coisas que não estão preenchidas e fora do lugar. Write-Output é o padrão, portanto não há necessidade real de especificá-lo. Use aspas simples para strings simples, duplas para variáveis ​​de expansão, cenários de formatação específicos usando, digamos, -f.

# write-output 'Calculating Mod Dates . . .'
'Calculating Mod Dates . . .'

# What I am showing here is called variable squeezing.
# It assigns to the variable while output to the screen so you can see what is being populated.
# remove the far left and far right parens to eliminate all the extra output
($path = 'E:\Temp')
($files = Get-ChildItem -Path $path) 

foreach ($file in $files) 
{
    # This is not doing anything as $importfile is not declared or populate anywhere that you have shown.
    # $ModDate = Get-Item $importfile | Foreach {$_.LastWriteTime}
    # This should be 
    ($ModDate = (Get-Item -Path $file.FullName).LastWriteTime)
    ($CurrentDate = Get-Date)
    ($difference = ($CurrentDate - $ModDate).TotalSeconds)
    # write-output "$importfile - $differece seconds ago."
    "$($file.Name) - $difference seconds ago."
}


# Results

 'Calculating Mod Dates . . .'
Calculating Mod Dates . . .

 ($path = 'E:\Temp')
E:\Temp

 ($files = Get-ChildItem -Path $path) 


    Directory: E:\Temp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        1/14/2019   3:42 PM                Reports
-a----        2/25/2019  10:27 AM          81966 Best-practices.jpg
-a----        2/25/2019  10:28 AM          82919 computer_speed.jpg
-a----        3/19/2019   3:34 PM             26 csv1.csv
...                                                                                     



 foreach ($file in $files) 
{
    ($ModDate = (Get-Item -Path $file.FullName).LastWriteTime)
    ($CurrentDate = Get-Date)
    ($difference = ($CurrentDate - $ModDate).TotalSeconds)
    "$($file.Name) - $difference seconds ago."
}


Monday, January 14, 2019 3:42:40 PM
Wednesday, March 27, 2019 11:55:21 AM
6207161.4845608
Reports - 6207161.4845608 seconds ago.
Monday, February 25, 2019 10:27:37 AM
Wednesday, March 27, 2019 11:55:21 AM
2597263.7171875
Best-practices.jpg - 2597263.7171875 seconds ago.
Monday, February 25, 2019 10:28:26 AM
Wednesday, March 27, 2019 11:55:21 AM
2597215.0719793
computer_speed.jpg - 2597215.0719793 seconds ago.
Tuesday, March 19, 2019 3:34:04 PM
Wednesday, March 27, 2019 11:55:21 AM
678077.1822375
csv1.csv - 678077.1822375 seconds ago.
Tuesday, March 19, 2019 3:34:34 PM
Wednesday, March 27, 2019 11:55:21 AM
678047.2243663
...

informação relacionada