Job
Job

Reputation: 505

How to do looping to rename and read a file using PowerShell?

I have many files in a folder with the same extension file. I want to rename the file one by one then do the other process, which is Proc_After_Rename. In this process, I will read some information of the file. In this process, I want to read the information of the file one by one based on the previous process to rename the extension file name. After I finish do the process, then I pick again the file to rename and do the process. For now, I can rename the file, but it rename it all the files directly before I do the other process. ANf when I go to this process Proc_After_Rename, I read the information for all the file, because all the file already rename the extension. Anyone can help, please

UPDATED

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

Upvotes: 0

Views: 232

Answers (3)

Walter Mitty
Walter Mitty

Reputation: 18940

One problem with your code is the Get-ChildItem inside Proc_After_Rename. This presents UIni with a list of files instead of a file. I have tried to fix this problem by reworking your code, and sliding part of Proc_After_Rename into Pick_File. I haven't tested any of this, but I hope it gives you a better idea of how to organize your code.

If I were writing this from scratch, I would use pipelines.

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

Upvotes: 0

Theo
Theo

Reputation: 61028

With the Get-ChildItem cmdlet, you can iterate the results easily by directly piping them through to a Foreach-Object. Inside that loop, every file found is a FileInfo object, represented by the automatic variable $_. Using the -Filter parameter the below code gets only files with a *.txt extension and by adding the -File switch you only recieve FileInfo objects, not Directory objects.

If I understand the question correctly, you want to first rename each *.txt file to *.ini and then do some more stuff with the renamed file. This should do it:

$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://learn.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

    # ........ #
}

Hope that helps

Upvotes: 3

Drewtang
Drewtang

Reputation: 109

    # 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. 
    }
}

Upvotes: 1

Related Questions