2014-09-28 4 views
0

У меня есть простой сценарий PowerShell, который массово переименовывает файлы, и я хотел бы иметь вывод таблицы, который показывает «Старое имя файла» и «Новое имя файла», чтобы показать изменения. Как мне получить доступ/ссылаться на новое имя файла, находясь в цикле «ForEach-Object», если это можно сделать? Могу ли я обновить это значение $ _? Я не хочу просто использовать переменную $ newname, потому что я создал это, и поскольку это должно быть выводимым, которое показывает, что имена файлов были фактически изменены, я хотел бы получить доступ к новому имени файла из системы, как это определено скрипт.Доступ к переменной PowerShell сразу после мутации

Write-Host "Old Name `t`t`t`t`t`t New Name" 
Write-Host "-------- `t`t`t`t`t`t --------" 

$files = Get-ChildItem -Path C:\Users\<user>\Desktop\Config 
$files | % ({ 
    if ((!$_.PsIsContainer) -and ($_.Extension -eq '')) { 
     $oldname = $_.FullName 
     $newname = "$($_.FullName).cfg" 
     Rename-Item $oldname $newname 

     # $_.Name still refers to the old file name without the extension 
     # How do I immediately access its new name (including extension)? 
     Write-Host $_.Name `t`t`t`t`t`t $newname 
    } 
}) 
+1

Что с помощью '$ newname'? Если никакая ошибка не возвращается «Переименовать-Элемент», вы можете предположить, что она сработала и что новое имя, которое вы выбрали, является правильным. – arco444

ответ

3

Вы можете сделать Get-Item на $ Новое_имя

(Get-Item $newname).Name 
+0

Спасибо. Именно то, что я искал. – spickles

1

Я взял на себя смелость переписать ваш сценарий немного, используя хэш-таблицу и New-Object.

Чтобы объяснить, что я здесь делаю, я разберу его немного для вас. Сначала я объявляю некоторые переменные, которые я буду использовать в моем цикле foreach, с этим: Примечание: параметр -File, так что он будет принимать только имена файлов, если вы хотите переименовать все, файлы и папку, а затем удалить их ,

$files = Get-ChildItem -Path "C:\Users\dha\Desktop\PS test folder" -File 
$OldFiles = $files 
[int]$i = "0" 

Тогда я беру каждый файл по одному, и создавая новое имя в:

$Newname = ("Blop" + "$i" + ".txt") 

А затем взять информацию файла для одного файла, и трубы его переименовать, пункт здесь

$File | Rename-Item -NewName $Newname 

в $ IXX просто plusser так увеличить количество файлов по одному на каждый раз, когда пробеги цикл по каждому элементу.

Затем я пишу таблицу хэшей с переменной $ Old_And_New.

Последнее, что я создаю объект с новым объектом и выводя его.

Надеюсь, что эта помощь и мои объяснения понятны.

Для сценария собраны:

$files = Get-ChildItem -Path "C:\Users\dha\Desktop\PS test folder" -File 
$OldFiles = $files 
[int]$i = "0" 

foreach ($File in $files) 
{ 
    $Newname = ("Blop" + "$i" + ".txt") 
    $File | Rename-Item -NewName $Newname 
    $i++ 

    $Old_And_New = @{ 
     'Old File Name' = "$OldFiles"; 
     'New File Name' = "$Newname" 
    } 

    $obj = New-Object -TypeName PSObject -Property $Old_And_New 
    Write-Output $obj 
} 
+0

Очень круто спасибо! – spickles

+0

Ответили на свой вопрос? Или есть что-нибудь еще ... ?? –

+0

Да, он ответил на это! Мне очень жаль, что я не буду давать адекватную обратную связь. – spickles