1

So I have an assignment where I have to create an PowerShell script that takes three parameters, "$foldername", "$filename" and "$number".

The script checks if the folder "$foldername" exists and if not, creates it. After that it creates as many new files named "$filename" as "$number" specifies. After that it reports how many files have been created and lists them.

What I have so far.

Param (
    [string]$foldername,
    [string]$filename,
    $number=1
)

if ((Test-Path -Path $foldername) -ne $true) {
    new-item -path $foldername -ItemType directory #if the folder doesn't exist, create it.
}
$new_file= $foldername+"\$_"+$filename #save the path and name of the new file to an variable
if ((Test-Path -Path $new_file* -PathType leaf) -eq $true) {
    Write-Host "$filename already exists in $foldername"
    break #if a file with a name that contains $filename in it exists in $foldername, break and do not create any new files.
}   
$null=1..$number | foreach { new-item -path $foldername -name $_$filename } #create new files using foreach.
write-host ("Created $number new files") #tell the user how many files were created
Get-ChildItem -path $foldername | where-object Name -like *$filename* | format-table Name #show the created files in a table format, formatted by name

There are a few problems and scuffed solutions in this script, but the main problem is the creation of the new files. Since the name of the new files come from $filename, simply running the script like so:

./script.ps1 -foldername C:\users\example\testing -filename "test.txt" -number 5

Would not work since it tries to create 5 files named "test.txt" and will just return errors.

I sort of solved it by using "foreach" and naming the files $_$filename which creates

1test.txt
2test.txt
...
5test.txt

But I found out that the correct way would be:

test1.txt
test2.txt
...
test5.txt

The number should be running in the filename somehow, but I am not sure how to do that.

Bonus points if you figure out how to check if the $filename files already exist in the target folder.

Talar
  • 13
  • 3
  • There are more efficient ways to go about this but, I think your code is fine. Just use an if statement before your call to create the file, so it can check if its there. Lastly, just switch the order of your value to the `-Name` parameter. You said you want it "something1", instead of "1something", so just switch the variables. – Abraham Zinala Jan 29 '22 at 18:27

1 Answers1

1

It's good to use Test-Path however I don't see a need for it here, you can use $ErrorAction = 'Stop' so that if the folder exists the script would instantly stop with a warning message. On the other hand, if the folder is a new folder there is no way the files already exist.

Param (
    [parameter(Mandatory)]
    [string]$FolderName,
    [parameter(Mandatory)]
    [string]$FileName,
    [int]$Number = 1
)

$ErrorActionPreference = 'Stop'

try {
    $newFolder = New-Item -Path $FolderName -ItemType Directory
}
catch {
    # If the folder exists, show this exception and stop here
    Write-Warning $_.Exception.Message
    break
}

$files = 1..$Number | ForEach-Object {
    # If this is a new Folder, there is no way the files already exist :)
    $path = Join-Path $newFolder.FullName -ChildPath "$FileName $_.txt"
    New-Item -Path $path -ItemType File
}

Write-Host 'Script finished successfully.'
$newFolder, $files | Format-Table -AutoSize

EDIT: I might have missed the point where you want to create the files in the folder even if the folder already exists, in that case you could use the following:

Param (
    [parameter(Mandatory)]
    [string]$FolderName,
    [parameter(Mandatory)]
    [string]$FileName,
    [int]$Number = 1
)

$ErrorActionPreference = 'Stop'

$folder = try {
    # If the Folder exists get it
    Get-Item $FolderName
}
catch {
    # If it does not, create it
    New-Item -Path $FolderName -ItemType Directory
}

$files = 1..$Number | ForEach-Object {
    $path = Join-Path $folder.FullName -ChildPath "$FileName $_.txt"
    try {
        # Try to create the new file
        New-Item -Path $path -ItemType File
    }
    catch {
        # If the file exists, display the Exception and continue
        Write-Warning $_.Exception.Message
    }
}

Write-Host "Script finished successfully."
Write-Host "Files created: $($files.Count) out of $Number"
$files | Format-Table -AutoSize
Santiago Squarzon
  • 41,465
  • 5
  • 14
  • 37