Powershell For-L oop выбрасывает MissingVariableNameAfterForeach - PullRequest
0 голосов
/ 23 января 2020

Почему я получаю сообщение об ошибке "MissingVariableNameAfterForeach" для следующего:

powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "foreach($file in Get-ChildItem C:){((Get-Date)-$file.LastWriteTime).ToString('dd')}"

Команда должна распечатать день с момента последней записи в файл / папку с сегодняшнего дня C: \

Ответы [ 3 ]

2 голосов
/ 23 января 2020

Ваша команда будет работать, если вы заключите Get-ChildItem в скобки.

powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^
    "foreach($file in (Get-ChildItem C:)){((Get-Date)-$file.LastWriteTime).ToString('dd')}"
2 голосов
/ 23 января 2020

Из текста справки:

PS C:\> powershell.exe /?
If the value of Command is a script block, the script block must be enclosed
in braces ({}). You can specify a script block only when running PowerShell.exe
in Windows PowerShell.

Попробуйте это:

powershell.exe -NoProfile -ExecutionPolicy Bypass -Command {Get-ChildItem C: | ForEach-Object{($_.LastWriteTime).ToString('dd')}}
1 голос
/ 23 января 2020

Возможно, я понял ваш вопрос, потому что существующие ответы, по-видимому, не предоставляют информацию, которую, как я думал, вы искали.

Хотя эти примеры конкретно не отвечают на вопрос, заданный в вашем заголовке, они предназначены для вывода того, что, я думаю, вы искали.

Вот поэтому моя попытка :

@"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoProfile -Command^
 "Get-ChildItem -Path 'C:\'|Sort-Object -Property LastWriteTime|"^
 "Select-Object -Last 1|Format-Table -AutoSize -Property Name,"^
 "@{Name='DaysOld';Expression={[Int]$((Get-Date)-$_.LastWriteTime).TotalDays}}"
@Pause

И, очевидно, версия, чтобы быть на топи c:

"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoProfile -Command "Get-ChildItem -Path 'C:\'|Sort-Object -Property LastWriteTime|Select-Object -Last 1|Format-Table -AutoSize -Property Name,@{Name='DaysOld';Expression={[Int]$((Get-Date)-$_.LastWriteTime).TotalDays}}"



На случай, если это просто мое недоразумение, возможно, этот может работать для вы:
@"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoProfile -Command^
 "Get-ChildItem -Path 'C:\'|Sort-Object -Property LastWriteTime -Descending|"^
 "Format-Table -AutoSize -Property Name,"^
 "@{Name='DayInMonth';Expression={($_.LastWriteTime).ToString('dd')}},"^
 "@{Name='DaysOld';Expression={[Int]$((Get-Date)-$_.LastWriteTime).TotalDays}}"
@Pause

версия:

"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoProfile -Command "Get-ChildItem -Path 'C:\'|Sort-Object -Property LastWriteTime -Descending|Format-Table -AutoSize -Property Name,@{Name='DayInMonth';Expression={($_.LastWriteTime).ToString('dd')}},@{Name='DaysOld';Expression={[Int]$((Get-Date)-$_.LastWriteTime).TotalDays}}"



В обоих случаях вы заметите, потому что я не запускаю Сценарий PowerShell, нет необходимости устанавливать политику выполнения. Команды должны работать так, как если бы они выполнялись непосредственно в окне PowerShell.
...