Как сделать зацикливание, чтобы переименовать и прочитать файл, используя PowerShell? - PullRequest
0 голосов
/ 24 июня 2019

У меня много файлов в папке с одинаковым расширением. Я хочу переименовать файл один за другим, а затем выполнить другой процесс, который является Proc_After_Rename. В этом процессе я прочитаю некоторую информацию о файле. В этом процессе я хочу прочитать информацию файла по одному на основе предыдущего процесса, чтобы переименовать имя файла расширения. После того, как я закончу процесс, я снова выберу файл для переименования и сделаю процесс. На данный момент я могу переименовать файл, но он переименует все файлы непосредственно, прежде чем я сделаю другой процесс. ANЕсли я перехожу к этому процессу Proc_After_Rename, я читаю информацию для всего файла, потому что все файлы уже переименовывают расширение. Любой может помочь, пожалуйста

ОБНОВЛЕНО

Function Proc_After_Rename
{
$Path = "C:\Users\SS\PowerShell\"
Write-Host "Do some process with .pro file"
$Job_Info =  Get-ChildItem -Path "$store\*.ini" -File -Force
& $Path\UIni.exe $Job_Info AGM CRM AGM_CUR_CRM AGM_CUR_CRM.CMD #this how I read the .ini file
start-sleep -s 1

$Read_AGM_CUR_CRM = Get-Content .\AGM_CUR_CRM.CMD
$a_AGM_CUR_CRM,$b_AGM_CUR_CRM     = $Read_AGM_CUR_CRM -split "="
$b_AGM_CUR_CRM 
Pick_file

}

Function Pick_file
{
$WKFD= "C:\Users\SS\PowerShell\"
$store = "$WKFD\GM"
$files = @(Get-ChildItem -Path "$store\*.txt") 
Foreach ($file in $files)
{
    # Check file existence
    if (Test-Path -Path $file -PathType Leaf)
    {
        # Get file name from object path file $file
        $file_name = @(Get-ChildItem -Path "$file" -Name)
        # Replace the .cue with .pro
        $new_name = $file_name -replace ".txt", ".ini" 
        # Rename the file
        Rename-Item -Path $file -NewName "$new_name"

    }
Proc_After_Rename

}
}

$A = Pick_file

Ответы [ 3 ]

3 голосов
/ 24 июня 2019

С помощью командлета Get-ChildItem вы можете легко выполнить итерацию результатов, напрямую отправив их на Foreach-Object.Внутри этого цикла каждый найденный файл представляет собой объект FileInfo , представленный автоматической переменной $_.Используя параметр -Filter, приведенный ниже код получает только файлы с расширением * .txt, и, добавив переключатель -File, вы получаете только объекты FileInfo, а не объекты Directory.

Если я правильно понял вопрос, высначала нужно переименовать каждый файл * .txt в * .ini, а затем сделать еще кое-что с переименованным файлом.Это должно сделать это:

$store = "C:\Users\HH"

Get-ChildItem -Path $store -Filter '*.txt' -File | ForEach-Object {
    # the automatic variable '$_' here represents a single FileInfo object in the list.
    # you don't need to test if the file exists, if it doesn't, Get-ChildItem would not return it.

    # create the new name for the file. Simply change the extension to '.ini'
    $newName = '{0}.ini' -f $_.BaseName
    # rename the file and get a reference to it using the -PassThru parameter
    $renamedFile = $_ | Rename-Item -NewName $newName -PassThru

    # for testing/proof:
    # remember that the '$_' variable now has old file name info.
    Write-Host ("File '{0}' is now renamed to '{1}'" -f $_.FullName, $renamedFile.FullName)

    # now do the rest of your processing, using the $renamedFile FileInfo object.
    # you can see what properties and methods a FileInfo object has here:
    # https://docs.microsoft.com/en-us/dotnet/api/system.io.fileinfo?view=netframework-4.8#properties
    # to get the full path and filename for instance, use $renamedFile.FullName

    # ........ #
}

Надеюсь, что поможет

1 голос
/ 24 июня 2019
    # Rename the file
    Rename-Item -Path $file -NewName "$new_name"

    # path of the renamed file
    $new_path_file = "$store\$new_name"

    # This is the process after rename the file
    # ........ #
   #Put your process here and make sure you reference the new file, as long as its in 
   #the foreach you are good. 
    }
}
0 голосов
/ 26 июня 2019

Одна проблема с вашим кодом - это Get-ChildItem внутри Proc_After_Rename. Это представляет UIni со списком файлов вместо файла. Я попытался решить эту проблему, переработав ваш код и поместив часть Proc_After_Rename в Pick_File. Я не проверял ничего из этого, но надеюсь, что это даст вам лучшее представление о том, как организовать ваш код.

Если бы я писал это с нуля, я бы использовал конвейеры.

Function Pick_file
{
$WKFD= "C:\Users\SS\PowerShell\"
$store = "$WKFD\GM"
$files = @(Get-ChildItem -Path "$store\*.txt") 
Foreach ($file in $files)
{
    # Check file existence
    if (Test-Path -Path $file -PathType Leaf)
    {
        # Get file name from object path file $file
        $file_name = @(Get-ChildItem -Path "$file" -Name)
        # Replace the .cue with .pro
        $new_name = $file_name -replace ".txt", ".ini" 
        # Rename the file
        Rename-Item -Path $file -NewName "$new_name"

        $new_file_name = $file.fullname
        & $Path\UIni.exe $new_file_name AGM CRM AGM_CUR_CRM AGM_CUR_CRM.CMD 
                   #this how I read the .ini file
        start-sleep -s 1

        $Read_AGM_CUR_CRM = Get-Content .\AGM_CUR_CRM.CMD
        $a_AGM_CUR_CRM,$b_AGM_CUR_CRM     = $Read_AGM_CUR_CRM -split "="
        $b_AGM_CUR_CRM 
    }


}
}

$A = Pick_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...