<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://freemwiki.com/index.php?action=history&amp;feed=atom&amp;title=Openai%2F696d32ab-db40-8002-88a6-787fbce475bb</id>
	<title>Openai/696d32ab-db40-8002-88a6-787fbce475bb - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://freemwiki.com/index.php?action=history&amp;feed=atom&amp;title=Openai%2F696d32ab-db40-8002-88a6-787fbce475bb"/>
	<link rel="alternate" type="text/html" href="https://freemwiki.com/index.php?title=Openai/696d32ab-db40-8002-88a6-787fbce475bb&amp;action=history"/>
	<updated>2026-07-26T19:46:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://freemwiki.com/index.php?title=Openai/696d32ab-db40-8002-88a6-787fbce475bb&amp;diff=595800&amp;oldid=prev</id>
		<title>Lukegao: by freem.ai...</title>
		<link rel="alternate" type="text/html" href="https://freemwiki.com/index.php?title=Openai/696d32ab-db40-8002-88a6-787fbce475bb&amp;diff=595800&amp;oldid=prev"/>
		<updated>2026-01-19T05:22:41Z</updated>

		<summary type="html">&lt;p&gt;by freem.ai...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
{{DISPLAYTITLE:Powershell auto-rename script}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;This conversation was exported from ChatGPT&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{cite web|title=Powershell auto-rename script|url=https://chatgpt.com/share/696d32ab-db40-8002-88a6-787fbce475bb|publisher=ChatGPT|access-date=2026-01-19}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== gpt-5-2-thinking ==&lt;br /&gt;
=== User: Can you write a Powershell script that solves the issue described in the picture? ===&lt;br /&gt;
Can you write a Powershell script that solves the issue described in the picture?&lt;br /&gt;
&lt;br /&gt;
=== Assistant: Here’s a PowerShell script that watches one or many folders and auto-renames any newly added file to: ===&lt;br /&gt;
Here’s a PowerShell script that watches one (or many) folders and auto-renames any newly added file to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;folder name&amp;gt; &amp;lt;next number&amp;gt;&amp;lt;original extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: dropping h322fsrdfk.jpg into beach\ becomes beach 4.jpg if beach 1.&amp;#039;&amp;#039;, beach 2.&amp;#039;&amp;#039;, beach 3.* already exist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&amp;lt;#&lt;br /&gt;
Auto-rename files when they appear in watched folders.&lt;br /&gt;
&lt;br /&gt;
Behavior:&lt;br /&gt;
* Watches one or more folders (non-recursive by default).&lt;br /&gt;
* When a new file is created or renamed into the folder, it renames it to:&lt;br /&gt;
    &amp;quot;&amp;lt;FolderName&amp;gt; &amp;lt;NextNumber&amp;gt;&amp;lt;OriginalExtension&amp;gt;&amp;quot;&lt;br /&gt;
  e.g. &amp;quot;beach 4.jpg&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Handles files that are still being written by waiting until the file is unlocked.&lt;br /&gt;
* Skips files that already match the pattern &amp;quot;&amp;lt;folder&amp;gt; &amp;lt;number&amp;gt;.&amp;lt;ext&amp;gt;&amp;quot;.&lt;br /&gt;
* Skips temporary/system-ish files (customize in $IgnoreRegex if needed).&lt;br /&gt;
#&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ------------------- CONFIG ------------------- ===&lt;br /&gt;
=== Add folders you want to watch here: ===&lt;br /&gt;
$WatchFolders = @(&lt;br /&gt;
  &amp;quot;C:\Images\beach&amp;quot;&lt;br /&gt;
  # &amp;quot;D:\OtherFolder&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
=== Watch subfolders too? ===&lt;br /&gt;
$IncludeSubdirectories = $false&lt;br /&gt;
&lt;br /&gt;
=== Ignore certain filenames (temp downloads etc). Adjust as needed. ===&lt;br /&gt;
$IgnoreRegex = &amp;#039;(\.tmp$|\.part$|\.crdownload$|^~\$)&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== How long to wait for a file to become available (seconds) ===&lt;br /&gt;
$MaxWaitSeconds = 15&lt;br /&gt;
&lt;br /&gt;
=== Poll interval while waiting (milliseconds) ===&lt;br /&gt;
$WaitIntervalMs = 200&lt;br /&gt;
=== --------------------------------------------- ===&lt;br /&gt;
&lt;br /&gt;
function Test-FileUnlocked {&lt;br /&gt;
  param([Parameter(Mandatory)][string]$Path)&lt;br /&gt;
  try {&lt;br /&gt;
    $stream = [System.IO.File]::Open($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)&lt;br /&gt;
    $stream.Close()&lt;br /&gt;
    return $true&lt;br /&gt;
  } catch {&lt;br /&gt;
    return $false&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Wait-ForFileReady {&lt;br /&gt;
  param(&lt;br /&gt;
    [Parameter(Mandatory)][string]$Path,&lt;br /&gt;
    [int]$MaxWaitSeconds = 15,&lt;br /&gt;
    [int]$IntervalMs = 200&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  $sw = [System.Diagnostics.Stopwatch]::StartNew()&lt;br /&gt;
  while ($sw.Elapsed.TotalSeconds -lt $MaxWaitSeconds) {&lt;br /&gt;
    if (Test-Path -LiteralPath $Path -PathType Leaf) {&lt;br /&gt;
      if (Test-FileUnlocked -Path $Path) { return $true }&lt;br /&gt;
    }&lt;br /&gt;
    Start-Sleep -Milliseconds $IntervalMs&lt;br /&gt;
  }&lt;br /&gt;
  return $false&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Get-NextNumberForFolder {&lt;br /&gt;
  param(&lt;br /&gt;
    [Parameter(Mandatory)][string]$FolderPath,&lt;br /&gt;
    [Parameter(Mandatory)][string]$FolderName&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  # Match: &amp;quot;&amp;lt;FolderName&amp;gt; &amp;lt;number&amp;gt;.&amp;lt;any extension&amp;gt;&amp;quot;&lt;br /&gt;
  $pattern = &amp;#039;^&amp;#039; + [regex]::Escape($FolderName) + &amp;#039;\s+(?&amp;lt;n&amp;gt;\d+)\.[^.]+$&amp;#039;&lt;br /&gt;
&lt;br /&gt;
  $max = 0&lt;br /&gt;
  Get-ChildItem -LiteralPath $FolderPath -File -ErrorAction SilentlyContinue | ForEach-Object {&lt;br /&gt;
    $m = [regex]::Match($_.Name, $pattern)&lt;br /&gt;
    if ($m.Success) {&lt;br /&gt;
      $n = [int]$m.Groups[&amp;#039;n&amp;#039;].Value&lt;br /&gt;
      if ($n -gt $max) { $max = $n }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return ($max + 1)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Rename-NewFile {&lt;br /&gt;
  param(&lt;br /&gt;
    [Parameter(Mandatory)][string]$FullPath&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  if (-not (Test-Path -LiteralPath $FullPath -PathType Leaf)) { return }&lt;br /&gt;
&lt;br /&gt;
  $item = Get-Item -LiteralPath $FullPath -ErrorAction SilentlyContinue&lt;br /&gt;
  if (-not $item) { return }&lt;br /&gt;
&lt;br /&gt;
  $fileName = $item.Name&lt;br /&gt;
&lt;br /&gt;
  # Ignore temp-ish files&lt;br /&gt;
  if ($fileName -match $IgnoreRegex) { return }&lt;br /&gt;
&lt;br /&gt;
  $folderPath = $item.Directory.FullName&lt;br /&gt;
  $folderName = Split-Path -Leaf $folderPath&lt;br /&gt;
&lt;br /&gt;
  # If it already matches &amp;quot;&amp;lt;folder&amp;gt; &amp;lt;number&amp;gt;.&amp;lt;ext&amp;gt;&amp;quot;, skip&lt;br /&gt;
  $alreadyPattern = &amp;#039;^&amp;#039; + [regex]::Escape($folderName) + &amp;#039;\s+\d+\.[^.]+$&amp;#039;&lt;br /&gt;
  if ($fileName -match $alreadyPattern) { return }&lt;br /&gt;
&lt;br /&gt;
  # Wait for the file to be fully written / unlocked&lt;br /&gt;
  if (-not (Wait-ForFileReady -Path $FullPath -MaxWaitSeconds $MaxWaitSeconds -IntervalMs $WaitIntervalMs)) {&lt;br /&gt;
    Write-Host &amp;quot;Skipped (file stayed locked too long): $FullPath&amp;quot;&lt;br /&gt;
    return&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  $ext = $item.Extension  # includes the dot&lt;br /&gt;
  $next = Get-NextNumberForFolder -FolderPath $folderPath -FolderName $folderName&lt;br /&gt;
&lt;br /&gt;
  # Ensure unique name even if something races in&lt;br /&gt;
  while ($true) {&lt;br /&gt;
    $newName = &amp;quot;$folderName $next$ext&amp;quot;&lt;br /&gt;
    $newPath = Join-Path $folderPath $newName&lt;br /&gt;
    if (-not (Test-Path -LiteralPath $newPath)) { break }&lt;br /&gt;
    $next++&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  try {&lt;br /&gt;
    Rename-Item -LiteralPath $FullPath -NewName $newName -ErrorAction Stop&lt;br /&gt;
    Write-Host &amp;quot;Renamed: &amp;#039;$fileName&amp;#039; -&amp;gt; &amp;#039;$newName&amp;#039;&amp;quot;&lt;br /&gt;
  } catch {&lt;br /&gt;
    Write-Host &amp;quot;Rename failed for $FullPath : $($_.Exception.Message)&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=== Create watchers ===&lt;br /&gt;
$watchers = @()&lt;br /&gt;
&lt;br /&gt;
foreach ($folder in $WatchFolders) {&lt;br /&gt;
  if (-not (Test-Path -LiteralPath $folder -PathType Container)) {&lt;br /&gt;
    Write-Host &amp;quot;Folder not found, skipping: $folder&amp;quot;&lt;br /&gt;
    continue&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  $fsw = New-Object System.IO.FileSystemWatcher&lt;br /&gt;
  $fsw.Path = $folder&lt;br /&gt;
  $fsw.Filter = &amp;quot;&amp;#039;&amp;#039;.&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
  $fsw.IncludeSubdirectories = $IncludeSubdirectories&lt;br /&gt;
  $fsw.NotifyFilter = [System.IO.NotifyFilters]&amp;#039;FileName, LastWrite&amp;#039;&lt;br /&gt;
&lt;br /&gt;
  # Handle Created + Renamed (covers many “copy into folder” behaviors)&lt;br /&gt;
  Register-ObjectEvent -InputObject $fsw -EventName Created -SourceIdentifier &amp;quot;FSW.Created.$folder&amp;quot; -Action {&lt;br /&gt;
    Rename-NewFile -FullPath $Event.SourceEventArgs.FullPath&lt;br /&gt;
  } | Out-Null&lt;br /&gt;
&lt;br /&gt;
  Register-ObjectEvent -InputObject $fsw -EventName Renamed -SourceIdentifier &amp;quot;FSW.Renamed.$folder&amp;quot; -Action {&lt;br /&gt;
    Rename-NewFile -FullPath $Event.SourceEventArgs.FullPath&lt;br /&gt;
  } | Out-Null&lt;br /&gt;
&lt;br /&gt;
  $fsw.EnableRaisingEvents = $true&lt;br /&gt;
  $watchers += $fsw&lt;br /&gt;
&lt;br /&gt;
  Write-Host &amp;quot;Watching: $folder&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Write-Host &amp;quot;Running. Press Ctrl+C to stop.&amp;quot;&lt;br /&gt;
while ($true) { Start-Sleep -Seconds 1 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
How to use (quick):&lt;br /&gt;
# Save as AutoRenameOnDrop.ps1&lt;br /&gt;
# Edit $WatchFolders to the folders you want.&lt;br /&gt;
# Run in PowerShell: ``&amp;lt;code&amp;gt;powershell powershell -ExecutionPolicy Bypass -File .\AutoRenameOnDrop.ps1 &amp;lt;/code&amp;gt;``&lt;br /&gt;
&lt;br /&gt;
If you want it to watch a parent folder and apply this rule to every subfolder (each subfolder uses its own name/numbering), tell me your folder structure and I’ll adapt the script.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ChatGPT Shares]]&lt;br /&gt;
[[Category:openai]]&lt;/div&gt;</summary>
		<author><name>Lukegao</name></author>
	</entry>
</feed>