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

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

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

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

コマンドプロンプト

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

バッチファイル

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

Q&A

解決済

2回答

5949閲覧

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

ttyp03

総合スコア16998

Windows

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

コマンドプロンプト

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

バッチファイル

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

0グッド

1クリップ

投稿2018/07/18 07:51

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

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

echo %1 | clip

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

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

SET /P<NUL=%1 | clip

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

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

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

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

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

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

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

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

papinianus

2018/07/18 08:06 編集

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

2018/07/18 23:22

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

回答2

0

ベストアンサー

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

dos

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

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

dos

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

投稿2018/07/18 08:57

編集2018/07/18 10:58
catsforepaw

総合スコア5938

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

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

takito

2018/07/18 09:43

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

2018/07/18 10:42

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

2018/07/18 10:55

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

2018/07/18 23:44

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

2018/07/19 01: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コマンド内部処理のコマンドライン文字列を解析する過程で特殊記号を空白に置き換えるような事をしていて、それが出力にも反映されてしまっているのではないかと思います。そして、ダブルクォーテーションでくくると、前述の仕様により後ろの空白は無視される、ということではないかと思います。本当にそうなのかどうかは判りませんが。
ttyp03

2018/07/19 01:25

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

2018/07/19 02:08

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

0

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

DOS

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

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

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

DOS

1echo|set /p=%1|clip

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

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

echo %1 | clip

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

投稿2018/07/18 13:35

編集2018/07/19 01:49
otn

総合スコア84499

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

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

ttyp03

2018/07/18 23:48

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

2018/07/19 00:51

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

2018/07/19 01:22

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

2018/07/19 01:36

set /pは本来は、 set /p NAME="名前を入れてください:" echo 貴方の名前は %NAME% です のように使います。1行読み取り機能です。 その読み取り機能を使わず、プロンプト文字列出力機能だけ使うので、入力は何でもいい訳です。 =の前に変数を書かない書式は多分20年くらい前に私が書いたのが初出ではないかと思います。
otn

2018/07/19 01:51

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

2018/07/19 02:04

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

2018/07/19 02:08

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問