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

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

ただいまの
回答率

90.33%

  • Windows

    1544questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • コマンドプロンプト

    359questions

    コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

  • バッチファイル

    244questions

    バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

改行コード・空白を付加しないでクリップボードに格納する方法

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 654

ttyp03

score 12140

引数で受け取った値をクリップボードに格納するバッチファイルを作成し、それを右クリックの送るメニューに登録しています。
用途としてはファイルのフルパス名をコピーする用です。

こんなバッチファイルです。

echo %1 | clip


しかしこれではコピーされたフルパス名の末尾に改行コードが付加されてしまいます。

そこでSET /Pを使う方法を試してみましたが、こちらでは空白(もしくは何かの制御コード?)が付加されてしまいます。

SET /P<NUL=%1 | clip


一旦ファイルに出力してから、それをクリップボードに入れなおす方法では成功しました。

SET /P<NUL=%1> getfullpathname.tmp
clip < getfullpathname.tmp
del getfullpathname.tmp


これで出来ているのでいいのですが、ファイルを使わずに実現できる方法があれば教えてください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2018/07/18 17:06 編集

    ご存じかもしれないし、そういう答えを求めてないとは思うんですが、シフトを押しながら右クリックでパスのコピーでは不適なんですよね

    キャンセル

  • ttyp03

    2018/07/19 08:22

    ご存知ではありませんでした orz なんで気づかなかったんだろう。情報ありがとうございます。しかし今やってみたらデフォルトでダブルクォーテーションが付加されてしまうのでバッチファイルでやる意義はあるようです。

    キャンセル

回答 2

checkベストアンサー

+3

試してみましたが、出力する文字列をダブルクォーテーションでくくれば良さそうな感じです。

set /P ="%1"< nul | clip

空白を含むパスだとダブルクォーテーションが出力されてしまうということで、以下のように変更します。

set /P ="%~1"< nul | clip

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/18 18:43

    私もこれに行き着きましたが、半角スペースのあるパス(C:\Program Files)だと結果が "C:\Program Files" となってしまいますね

    キャンセル

  • 2018/07/18 19:42

    set /P =%1< nul | clip
    これで、sendtoフォルダにショートカット作ってやったら、スペースを含むファイル名でもOKでした。(Windows10)

    キャンセル

  • 2018/07/18 19:55

    takito さん

    %1の中身がダブルクォーテーションでくくられている可能性がある場合は、%~1とやれば良いです。

    キャンセル

  • 2018/07/19 08:44

    set /P ="%~1"< nul | clip
    これで動作確認できました。
    引数に対して~は知らなかったです。
    ところでなんでダブルクォーテーションで括ると良いのでしょうか。
    そこの理屈がわかるとうれしいです。

    キャンセル

  • 2018/07/19 10:05

    set /Pに渡すプロンプト文字列の細かい仕様が公開されていないので正確なところは判りませんが、ダブルクォーテーションでくくるのとくくらないのとでは、若干挙動が変わります。

    set /P VAR=abc def

    この場合、プロンプトには`abc def`と表示されますが、

    set /P VAR="abc" def

    こうすると`abc`とだけ表示され、` def`は無視されます。
    さらに、間の空白を取って、

    set /P VAR="abc"def

    とやっても`abc`だけ表示されます。
    ところが、

    set /P VAR=a"bcd"ef

    こうすると`a"bcd"ef`と表示されます。

    おそらくですが、set /Pのプロンプト文字列がダブルクォーテーションで始まっている場合、ダブルクォーテーションでくくられた中身だけを出力するという仕様になっているのではないかと思います。

    ただ、何故ダブルクォーテーションでくくらないと後ろに余計な空白が付くのかは判りません。もしかしたら、setコマンド内部処理のコマンドライン文字列を解析する過程で特殊記号を空白に置き換えるような事をしていて、それが出力にも反映されてしまっているのではないかと思います。そして、ダブルクォーテーションでくくると、前述の仕様により後ろの空白は無視される、ということではないかと思います。本当にそうなのかどうかは判りませんが。

    キャンセル

  • 2018/07/19 10:25

    結局のところは詳細は不明ということですね。

    キャンセル

  • 2018/07/19 11:08

    catsforepawさん、otnさん、回答ありがとうございました。
    どちらの対処法も理にかなっていて甲乙つけられませんでしたので、先着順でベストアンサーを決めさせていただきました。

    キャンセル

+2

どうも、入力リダイレクトが原因のようです。論理的に説明が付かないので、バグかも。
しかも、出力がパイプの時だけですね。

D:\>set /p=aaaa<NUL&set /p=bbbb<NUL
aaaabbbb


画面出力にしか使ったこと無かったので気づきませんでした。

リダイレクトを使わなければ良いので、

echo|set /p=%1|clip


ということでも解決できます。

あと、不用意に空白を入れない方が良いです。例えば、

echo %1 | clip

だと、echo%1のあとの空白も出力します。Linuxに慣れていると罠。
echo %FOO% >fileとか書きがちです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 08:48

    echo|set /p=%1|clip
    これで動作確認できました。
    空白の件はある程度は心得ています。
    echo %1 | clip は、echo %1|clip でも試して同じ結果でしたので見栄えが良い方を載せた次第です。
    しかし思わぬところで空白が混入するので、バッチファイルは気を使いますね。
    普通のプログラムの感覚で書いているとどうしても可読性を優先してしまいますし。

    ひとつ質問です。
    echo|set /p=%1
    ここの仕組みが良くわからなかったのですが、ここはどういった動きになるのでしょうか。

    キャンセル

  • 2018/07/19 09:51

    > ひとつ質問です。
    set /p=<NULが分かって、echo|set /p=が分からないというのがどういう状況なのか分かりません。
    そもそも、本来のset /pの使い方を分かっていますか?

    キャンセル

  • 2018/07/19 10:22

    いや、set /p=<NUL も調べたら出てきたやつなんで…。
    それはそのサイトの解説を見て理解しているのですが、引数なしのechoをパイプでつなげるとどういう効果があるのでしょうか。

    キャンセル

  • 2018/07/19 10:36

    set /pは本来は、

    set /p NAME="名前を入れてください:"
    echo 貴方の名前は %NAME% です

    のように使います。1行読み取り機能です。
    その読み取り機能を使わず、プロンプト文字列出力機能だけ使うので、入力は何でもいい訳です。

    =の前に変数を書かない書式は多分20年くらい前に私が書いたのが初出ではないかと思います。

    キャンセル

  • 2018/07/19 10:51

    NUL以外の一般ファイルのリダイレクトを確認した際にミスがあったようなので、回答を修正しました。
    NULに限らずリダイレクトすると空白がつきますね。

    キャンセル

  • 2018/07/19 11:04

    解説ありがとうございます。
    理解しました。

    キャンセル

  • 2018/07/19 11:08

    catsforepawさん、otnさん、回答ありがとうございました。
    どちらの対処法も理にかなっていて甲乙つけられませんでしたので、先着順でベストアンサーを決めさせていただきました。

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Windows

    1544questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • コマンドプロンプト

    359questions

    コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

  • バッチファイル

    244questions

    バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。