Причина, по которой вы не можете просто использовать $count++
в своем блоке скрипта для прямого увеличения порядкового номера:
Блоки сценария с отложенной привязкой - например, тот, который вы передали в Rename-Item -NewName
- и блоки сценария в вычисляемые свойства выполняются в дочерней области сильный>.
Следовательно, попытка изменить переменные вызывающей стороны вместо этого создает block -local переменную, которая выходит за пределы области видимости на каждой итерации, так что на следующей итерации снова будет видно исходное значение из область вызывающего абонента.
- To learn more about scopes and implicit local-variable creation, see this answer.
Обходные пути
Прагматичный, но потенциально ограничивающий обходной путь - использовать спецификатор области $script:
, то есть $script:count
, для ссылки на переменную $count
вызывающего объекта:
$directory = 'C:\Temp'
[int] $count=71
gci $directory | sort -Property LastWriteTime |
rename-item -newname { '{0}_{1}' -f $script:count++, $_.Name } -whatif
Это будет работать:
в интерактивном сеансе (в командной строке, в глобальной области).
в сценарии, пока переменная $count
была инициализирована в области верхнего уровня сценария.
- That is, if you moved your code into a function with a function-local
$count
variable, it would no longer work.
Для гибкого решения требуется надежная относительная ссылка на родительскую область действия:
Есть два варианта:
- концептуально ясно, но многословно и сравнительно медленно из-за необходимости вызова командлета:
(Get-Variable -Scope 1 count).Value++
gci $directory | sort -Property LastWriteTime |
rename-item -newname { '{0}_{1}' -f (Get-Variable -Scope 1 count).Value++, $_.Name } -whatif
- несколько непонятно, но быстрее и лаконичнее:
([ref] $count).Value++
gci $directory | sort -Property LastWriteTime |
rename-item -newname { '{0}_{1}' -f ([ref] $count).Value++, $_.Name } -whatif
[ref] $count
фактически то же самое, что Get-Variable -Scope 1 count
(при условии, что переменная $count
была установлена в родительской области)
Примечание. Теоретически вы можете использовать $global:count
как для инициализации, так и для увеличения глобальной переменной в любой области, но, учитывая, что глобальные переменные сохраняются даже после завершения выполнения скрипта, вы должны тогда также заранее сохраните любое ранее существовавшее значение $global:count
и восстановите его после, что делает этот подход непрактичным.
person
mklement0
schedule
01.07.2019
$count
на$script:count
. - person TheMadTechnician   schedule 02.07.2019