質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

7055閲覧

PowerShellにてファイル名置換

matusmon

総合スコア12

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2018/03/05 13:54

前提・実現したいこと

エスケープが必要な文字を含むファイル名の先頭文字を1文字目としたとき、
1文字目から10文字目と、拡張子を除いた末尾一文字を削除したい。

# 元のファイル名 XXXXXXXXXXAAAAAAAAAAAAAAAAX.txt # リネーム後のファイル名 AAAAAAAAAAAAAAAA.txt

発生している問題

まず、前提として、
Windows上で、ファイル名の置換をしたいファイルをスクリプトへドラッグ・アンド・ドロップするような使い方を想定しています。

そのために、以下のURLのようにに、バッチをかませてからPowerShellスクリプトを呼び出そうと考えています。
https://qiita.com/harry0000/items/e8c35b8e53cdae513d9d

バッチから呼ばれたPowerShellを、
例えば、先頭の1文字目から10文字目を削除するために以下のようなスクリプトとしたとき、
$argにエスケープが必要な文字を含んでいた場合、何もせず終了してしまいます。

powershell

1foreach ($arg in $args) { 2 Get-ChildItem $arg| Rename-Item -NewName { $_.Name -replace '^..........','' } 3} 4

ドラッグ・アンド・ドロップしてきたファイル名にエスケープが必要な文字を含んでいた場合でも、きちんと処理が行えるようにするためには、どのような方法があるでしょうか。

補足情報(FW/ツールのバージョンなど)

PowerShellのバージョンは5.0です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imihito

2018/03/05 14:00 編集

ファイルのドロップ、フォルダのドロップ、どちらを想定しているのでしょうか? 質問文を見る限りファイルを想定しているようですが、なぜ`Get-ChildItem`(フォルダなどの子要素を取得するコマンドレット)を使用しているのでしょうか?
matusmon

2018/03/05 14:31 編集

ファイルのドロップです。 渡されたフルパスから ファイル名、拡張子を識別して抜き出すために使用していました。
Zuishin

2018/03/05 22:33

Get-Item を使ってください。それと不具合の起こるファイル名の実例を挙げてください。
matusmon

2018/03/06 11:14

Get-Item、使用してみます。実例としましては、"AAAAA_NN_(XXXXXXXXXXXXX[X]).txt"のようなファイル名です。
guest

回答1

0

ベストアンサー

こんにちは。
質問への追記が依頼されていますので、まずはそれにお答えいただきたいのですが、私のほうからは予想で回答させていただきます。

質問の中にある「エスケープが必要な文字」はおそらくPowerShellのワイルドカード文字(*,[,],?)を指していると推測します。

例えばファイル名が"[XXXXXXXXXAAAAAAAAAAAAAAAA].txt"の場合Get-ChildItem(Zuishinさんの指摘の様にGet-Itemでも同様です)には-LiteralPathを指定してやらないと正しくファイルを取得できません。
ファイルを取得できなれければ後続のRename-Itemは実行されないので何もせずに処理が終了します。

powershell

1# NG : これはファイルに対してワイルドカード検索がかかってしまうのでダメ 2Get-ChildItem "C:\Temp[XXXXXXXXXAAAAAAAAAAAAAAAA].txt" 3Get-Item "C:\Temp[XXXXXXXXXAAAAAAAAAAAAAAAA].txt" 4 5# OK : 正しく単一のファイルを取得できる 6Get-ChildItem -LiteralPath "C:\Temp[XXXXXXXXXAAAAAAAAAAAAAAAA].txt" 7Get-Item -LiteralPath "C:\Temp[XXXXXXXXXAAAAAAAAAAAAAAAA].txt"

ですので、

powershell

1foreach ($arg in $args) { 2 Get-ChildItem -LiteralPath $arg| Rename-Item -NewName { $_.Name -replace '^..........','' } 3}

の様にしてやれば良いかと思います。

投稿2018/03/06 09:52

stknohg

総合スコア796

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matusmon

2018/03/06 11:27

-LiteralPath というオプションがあったのですね。microsoftのオンラインヘルプを読み理解することができました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問