web-dev-qa-db-ja.com

ファイルの名前を変更する方法-名前を削除して番号を保持する

名前とバッジ番号を含む多くのファイルの名前を変更する必要があります。

ファイルは次のようになります: "John Doe1234.txt"そして名前を1234.txtに変更する必要があります
(新しいファイルにはバッジ番号のみが含まれている必要があります)。
また、バッジ番号は固定されていないため、3〜4個の番号を含めることができます。

更新:ファイル名には、スペースで区切られた2〜3個の名前が含まれています。例:「JohnDoe123.txt」または「JohnJuniorDoe1234.txt」

名前からすべての文字とスペースを削除し、数字のみを保持することを考えていましたが、Powershellの知識が十分ではありません。

誰かが私を助けてくれますか?

2
Remus Rigo

ファイル名cannotには特殊文字(_/\:*?"<>|_)を含めることができますが、_%_と_!_は、_cmd.exe_の誤解を引き起こす可能性があるため、コードは絶対確実ではありません。コードIS NOW FOOLPROOF。

_@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set "dir=YOUR DIRECTORY HERE"
set "_output="
set "map=0123456789"

pushd "%dir%"

FOR %%a in (*.txt) do (
    SETLOCAL
    set "file=%%~na"
    1>temp.log echo(!file!
    for %%b in (temp.log) do set /A len=%%~zb-2
    del /F /Q temp.log
    for /L %%A in (0 1 !len!) do (
        for /F "delims=*~ eol=*" %%? in ("!file:~%%A,1!") do if "!map:%%?=!" NEQ "!map!" set "_output=!_output!%%?"
    )
    ren "!file!.txt" "!_output!.txt"
    ENDLOCAL
)
ENDLOCAL
_

スクリーンショット:


SETLOCALのため、最大31個のファイルしか処理できません。私の仮定は間違っていました。SETLOCALENDLOCALのペアがあるため、無限のファイルを処理できます。

1

すべてのファイル名が「FirstLastNumber.txt」の形式であると仮定します

実行できます:

pushd "C:\Temp\su\"
dir | ? { $_.Name -like "*.txt" } | 
% { Rename-Item $_ "$($_.BaseName.split(' ')[2])$($_.Extension)" }
popd

パスに一致するように最初の行を変更します。 (スニペット全体を貼り付けて、Enterキーを2回押します)

Screenshot to show beginning filenames, the command, then the result.

2
Narzard

パワーシェル:

必要に応じて編集$ Source。 "-WhatIf"パラメータは、ポストされたコードを実行して、必要なファイルが見つかったこととNewNameが正しいことを確認できることを意味します。 "-WhatIf"パラメータを削除して、実際にファイルの名前を変更します。

$Source = 'c:\path\to\files'
Get-CHildItem $SOurce *.txt -File |
    Rename-Item -NewName { $_.Name.Split(' ')[-1] } -whatIf
0
Keith Miller

すべての入力ファイルがスペースとその後に少なくとも1つの数字で終わると仮定すると、これはジョブを実行するさらに別の方法のように見えます。重複番号はチェックしません。 [ニヤリ]

それがすること...

  • ソースと宛先ディレクトリを定義します
    私は常に元のファイルを壊すことにひねくれているので、これは名前を変更するではなくコピーするです。直接実行する場合は、Copy-ItemRename-Itemに置き換えます。
  • いくつかのテストディレクトリとファイルを作成します
    実際に物事を行う準備ができたら、その地域全体を削除します。
  • 取得するファイルタイプを定義します
  • フィルタに一致するファイルを取得します
  • .BaseNameプロップがスペースと少なくとも1桁で終わっていないファイルを削除します
  • スペースで.Basenameを分割し、結果の最後の項目を取得します
  • 上記に.Extension小道具を追加します
  • newフルファイル名をビルドします
  • 古い完全なファイル名を新しい完全なファイル名にコピーします
  • -PassThru行のCopy-Itemは、「ファイルを作成した」という情報を画面に送信します

コード ...

$SourceDir = "$env:TEMP\InFiles"
$DestDir = "$env:TEMP\OutFiles"

#region >>> make some test dirs & files
$SourceDir, $DestDir |
    ForEach-Object {
        $Null = mkdir -Path $_ -ErrorAction 'SilentlyContinue'
        }
# the last file is not to be worked on - wrong pattern
@'
FName LName 1234.txt
Alfa Bravo Charlie 89.txt
First Middle Last 666.txt
Wiki Tiki Exotica Music.txt
'@ -split [System.Environment]::NewLine |
    ForEach-Object {
        $Null = New-Item -Path $SourceDir -Name $_ -ItemType 'File' -ErrorAction 'SilentlyContinue'
        }
#endregion >>> make some test files

$Filter = '*.txt'
Get-ChildItem -LiteralPath $SourceDir -Filter $Filter -File |
    Where-Object {
        # filter out any basename that does NOT end with a space followed by at least one digit
        $_.BaseName -match ' \d{1,}$'
        } |
    ForEach-Object {
        # split on the spaces & take the last item from the resulting array
        $NewBaseName = $_.BaseName.Split(' ')[-1]
        $NewFileName = '{0}{1}' -f $NewBaseName, $_.Extension
        $FullNewFileName = Join-Path -Path $DestDir -ChildPath $NewFileName
        Copy-Item -LiteralPath $_.FullName -Destination $FullNewFileName -PassThru
        }
0
Lee_Dailey

これは、次の方法を使用してバッチファイルで実行できます。

これは、最初の文字とスペースの数に関係なく機能します。

@echo off
setlocal enabledelayedexpansion

set "fPath=C:\test\my files\"

:: For each .txt file found in path %fPath% do....
for /F "tokens=*" %%a in ('DIR /B /ON "%fPath%*.txt"') do (
    echo Processing: %%a
    set "oName=%%a"
    set "fName=%%a"
    call :loop
)
echo Finished
endlocal
pause

:eof
exit /B



::=====================================================================
:: Check if the name is only numbers plus ".txt" on the end and if not, then remove the first character and check again.
:: If only numbers remaining, rename the original file. If no characters left then no match found and should go to next file.

:loop
if "!fName!"==".txt" exit /B
echo !fName!|findstr /r /c:"^[0-9]*\.txt$">nul
if !errorlevel! NEQ 0 set "fName=!fName:~1!" && goto :loop
ren "%fPath%%oName%" !fName!
exit /B
0
Durry42

このタスクを実行するために追加のtemp.logファイルを作成する必要はなく、ファイル名に含まれる数字以外の文字について心配する必要もありません。

U N I C O D Eを使用してこれを行う場合は、ループforでフィルタリングします。ファイル名から出力された数値を取得します。これは次の方法で実行できます。

cmd /u "echo\ string" | findstr regex

1)cmd /uecho\stringを1文字ずつ名前付けます

cmd /u /c echo\John Doe 123.txt

2)findstr [0-9]は変数!_n!のループ内の数値のみを取得します%%~n

echo\John Doe 123.txt|%__APPDIR__%findstr.exe [0-9]

3)変数!_n!を使用して、出力番号のみを結合することにより、%%~n文字をインクリメントします

set "_n=!_n!%%~n"
@echo off && setlocal EnableDelayedExpansion

pushd "c:\path\to\your\files"
set "_where=%__APPDIR__%where.exe" 
set "_findstr=%__APPDIR__%findstr.exe [0-9]"

for /f "tokens=*" %%S in ('!_where! .:"*.*"^|find/v "%~x0"')do (set "_str=%%~nS" && (
  for /f %%n in ('cmd/u/cecho\"!_str!"^|find/v " "^|!_findstr!')do set "_n=!_n!%%~n" )
   2>nul rename "%%~S" "!_n!%%~xS" && echo\"%%~S" ==^> .\!_n!%%~xS && set "_n=" <nul ) 

popd & %__APPDIR__%timeout.exe -1 & endlocal & goto :EOF
  • このファイルのパス/名前レイアウトの場合:
G:\SUPER_USER\Q1533871\John Doe 123.txt
G:\SUPER_USER\Q1533871\John Doe 1234.txt
G:\SUPER_USER\Q1533871\John Junior Doe 00001.txt
G:\SUPER_USER\Q1533871\John Junio Doe 154200 1 .txt
  • コードの結果/出力:
G:\SUPER_USER\Q1533871\John Doe 123.txt ==> .\123.txt
G:\SUPER_USER\Q1533871\John Doe 1234.txt ==> .\1234.txt
G:\SUPER_USER\Q1533871\John Junior Doe 00001.txt ==> .\00001.txt
G:\SUPER_USER\Q1533871\John Junio Doe 154200 1 .txt ==> .\1542001.txt
  • コードにさらにタスクを実装する方法...
@echo off && setlocal EnableDelayedExpansion

pushd "c:\path\to\your\files"
set "_where=%__APPDIR__%where.exe" 
set "_findstr=%__APPDIR__%findstr.exe [0-9]"

for /f "tokens=*" %%S in ('!_where! .:"*.*"^|find/v "%~x0"')do (set "_str=%%~nS" && (
  for /f %%n in ('cmd/u/cecho\"!_str!"^|find/v " "^|!_findstr!')do set "_n=!_n!%%~n" )
   2>nul rename "%%~S" "!_n!%%~xS" && echo\"%%~S" ==^> .\!_n!%%~xS && set "_n=" <nul

   rem ::  Aditionals taks commands enter here bellow here....

   ) 

popd & %__APPDIR__%timeout.exe -1 & endlocal & goto :EOF

コマンドラインのヘルプについては、/?を使用できます

Pushd /?, Popd /?, Find /?, Findstr /?, Ren /?, For /?, Setlocal /?, Endlocal /?, Goto /?, Setlocal /?, Endlocal /?, if /?, timeout /?, ... /?

インターネットでは、次の点についてさらにヘルプを得ることができます:

すみません、私の限られた英語

0
It Wasn't Me