3

Я пытаюсь собрать сценарий Powershell, который будет:

- Поиск рекурсивно из корневого каталога
Исключить файлы с существующим префиксом имени файла "yyyyMMdd"
-Переименуйте файлы, не исключенные выше, с префиксом имени файла "" yyyyMMdd "на основе их конкретного LastWriteTime

Примечание: в идеале этот скрипт должен включать все расширения типов файлов

Я попробовал себя, но это, казалось бы, было у меня над головой, так как мои попытки не увенчались успехом.

Заранее спасибо.

http://ss64.com/ps/syntax-stampme.html

#StampMe.ps1
param( [string] $fileName)

# Check the file exists
if (-not(Test-Path $fileName)) {break}

# Display the original name
"Original filename: $fileName"

$fileObj = get-item $fileName

# Get the date
$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"

$extOnly = $fileObj.extension

if ($extOnly.length -eq 0) {
   $nameOnly = $fileObj.Name
   rename-item "$fileObj" "$nameOnly-$DateStamp"
   }
else {
   $nameOnly = $fileObj.Name.Replace( $fileObj.Extension,'')
   rename-item "$fileName" "$nameOnly-$DateStamp$extOnly"
   }

# Display the new name
"New filename: $nameOnly-$DateStamp$extOnly"

Я надеюсь изменить строку:

$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"

Быть LastWriteTime вместо get-date, но я понятия не имею, как это сделать.

Этот код (из другого вопроса суперпользователя):

Get-ChildItem "Test.pdf" | Rename-Item -newname {$_.LastWriteTime.toString("yyyyMMdd") + " Test.pdf"}

... успешно переименовывает один файл, но я не могу интегрировать это в больший скрипт.


Что касается рекурсивного выполнения вышеизложенного, я попробовал это (также с http://ss64.com/ps/syntax-stampme.html):

foreach ($file in get-ChildItem *.* -recurse) { ./StampMe.ps1 $file.name }

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

1 ответ1

3

Этот скрипт должен делать именно то, что вы хотите

  • Поиск рекурсивно из корневого каталога
  • Исключить файлы с существующим префиксом имени файла "yyyyMMdd"
  • Переименуйте файлы, не исключенные выше, с помощью префикса имени файла "" yyyyMMdd "в соответствии с их конкретным LastWriteTime

Предупреждение: Вы должны сначала протестировать этот скрипт, потому что переименование может быть опасным. Удалите # перед Rename-Item после того, как вы убедились, что только преднамеренные файлы будут переименованы.

Длинная версия

$folder = "C:\somefolder"
$files = get-childitem -path $folder -recurse | where { -not $_.PSIsContainer }
[datetime]$dirDate = New-Object DateTime

foreach ($file In $files) {

    $strDate = $file.Name.substring(0,8)

    if (-Not [DateTime]::TryParseExact($strDate, "yyyyMMdd", 
        [System.Globalization.CultureInfo]::InvariantCulture, 
        [System.Globalization.DateTimeStyles]::None, [ref]$dirDate)) {

        $newName = $file.lastwritetime.tostring("yyyyMMdd ") + $file.name
        echo $newName
        #Rename-Item -path $file.Fullname -newname $newName
    }   
}

Укороченная версия

[datetime]$dirDate = New-Object DateTime

dir "C:\somefolder" -r | ? { ! $_.PSIsContainer } | % {          

    if ( ! [DateTime]::TryParseExact($_.Name.substring(0,8), "yyyyMMdd", 
        [System.Globalization.CultureInfo]::InvariantCulture, 
        [System.Globalization.DateTimeStyles]::None, [ref]$dirDate)) {

        $newName = $_.lastwritetime.tostring("yyyyMMdd ") + $_.name
        echo $newName
        #Ren $_.Fullname $newName
    }
}

Используемые ответы stackoverflow

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .