71351


Windows 上で正規表現でファイル名を一括変換するようなバッチを書きたいのですが  
ふだん Linux 上でしかプログラムしたことがなく文字コード関係でつまずいてうまくいきません

[code]

    files = Dir.entries('.')
    files.each{|f|
      rename = f.gsub(/のコピー/, '')
      if f != rename
        puts "#{f} => #{rename}"
      end
    }
    
[/code]

最初にこのようにリネーム候補を出力するようにかいてみたんですが

[code]

    ./rename.rb:5:in 'gsub': incompatible encoding regexp match (UTF-8 regexp with Windows-31J string) (Encoding::CompatibilityError)
    
[/code]

というエラーになります

そのあと文字コード関係でいろいろ検索してみてソースの最初に

[code]

    # encoding: Shift_JIS
    
[/code]

をいれてみたのですが特にエラー変化がありません

次に正規表現のパターンの文字コードを指定する

[code]

    /のコピー/s
    
[/code]

とパターンのあとに s とかいてみたところ

[code]

    ./rename.rb:6: regexp encoding option 's' differs from source encoding 'Shift_JIS'
    
[/code]

というエラーに変化しましたが先ほどソースコード1行目に Shift_JIS を指定したのになぜエラーになるのかがわかりません

べつに Ruby である必要もなく  
Python と node.js もはいってるので  
Windows で文字コードを気にすることなく  
簡単に正規表現でファイルをリネームする方法があれば教えてほしいです

bash があればもっと簡単だったんですが…

* * *

回答いただいた内容にコメントでは書ききれないので追記させていただきます

PowerShell を使ってみました

[code]

    $files = Get-ChildItem .
    foreach ($f in $files) {
      $rename = $f.Name -replace 'のコピー', ''
      if ($f.Name -ne $rename) {
        # Rename-Item $f $rename
        echo "$f => $rename"
      }
    }
    
[/code]

いきなりリネームされないように echo するだけに書き換えて（あってるかもわからないですが）  
rename.ps1 という名前で保存

右クリック PowerShell で実行  
一瞬窓が立ち上がるんですが何も表示されずに終了します

貼り付けて実行すると何も表示されません

リネームだったら動くのかもしれないんですが  
1度どのファイルがどういう名前になるか  
確認したいので echo でデバッグした出力を確認したいです

で編集というのを選んでみると powershell ISE というのが起動して  
そこでデバッグ >> 実行を選んだところ

[code]

    PS *****\rename.ps1
    このシステムではスクリプトの実行が無効になっているため、ファイル *****\rename.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
        + CategoryInfo          : セキュリティ エラー: (: ) []、ParentContainsErrorRecordException
        + FullyQualifiedErrorId : UnauthorizedAccess
    
[/code]

(パス名はユーザ名が入ってるのでふせています)

[PowerShellスクリプティングの第一歩（後編） (1/5) -
@IT](https://www.atmarkit.co.jp/ait/articles/0709/20/news125.html)

この記事によると

>
> PowerShellではセキュリティ上の理由から、デフォルトでスクリプトの実行が無効に設定されている。そのため、スクリプト・ファイルを実行するためには、あらかじめPowerShellのスクリプト実行ポリシーを変更しておく必要がある。実行ポリシーを変更するにはSet-
> ExecutionPolicyコマンドレットを利用する。
>
> PS > Set-ExecutionPolicy RemoteSigned

とあるのでこれを実行してみたんですが

[code]

    Set-ExecutionPolicy: Access to the path 'C:\Program Files\PowerShell\7\powershell.config.json' is denied.
    To change the execution policy for the default (LocalMachine) scope, start PowerShell with the "Run as administrator" option. To change the execution policy for the current user, run "Set-ExecutionPolicy -Scope CurrentUser".
    
[/code]

と管理者権限での実行を要求されました

管理者権限を取得するには申請がいるので、この程度の作業内容では申請したくないというのが本音です


CC BY-SA 4.0
2020-10-20T09:50:11.507
71348
2020-10-20T11:55:48.037
2020-10-20T11:55:48.037
3060
question
windows 正規表現
Windows 上で正規表現を使ってファイルをリネームしたい


Windows付属のPowerShellの場合、Unicodeで動作するので文字コードを気にすることなく正規表現を使うことができます。

[code]

    $files = Get-ChildItem .
    foreach ($f in $files) {
      $rename = $f.Name -replace 'のコピー', ''
      if ($f.Name -ne $rename) {
        Rename-Item $f $rename
      }
    }
    
[/code]

このサンプルではわかりづらいですが、もちろん、[`-replace`は正規表現置換](https://docs.microsoft.com/en-
us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7#replacement-
operator)を行います。


CC BY-SA 4.0
2020-10-20T10:31:46.693
71351
2020-10-20T10:44:56.627
2020-10-20T10:44:56.627
4236
4236
71348
answer