95246
Powershell上で以下を実行した際に、`{"test":10}` という文字列をメッセージとして送りたかったので、

```

    ps> .\mosquitto_pub -h test.mosquitto.org -t spresense/mqtt -m "{\"test\":10}"
    
```

を実行しようとしてもエスケープ文字が解釈できずエラーになってしまいます。

```

    ps> .\mosquitto_pub -h test.mosquitto.org -t spresense/mqtt -m "{`"test`":10}"
    
```

は、送信できますが、subscriberは、`{test:10}` と解釈します。

```

    ps> .\mosquitto_pub -h test.mosquitto.org -t spresense/mqtt -m "{""test"":10}"**
    
```

も送信できますが、 `{test:10}` と解釈します。実際には、どのように送ればよいのでしょうか？

コマンドプロンプトでは、

```

    > .\mosquitto_pub -h test.mosquitto.org -t spresense/mqtt -m "{\"test\":10}"
    
```

で送ることができ、subscriberは、 `{"test":10}` と解釈できています。
CC BY-SA 4.0
2023-06-15T07:31:14.853
95243
2023-06-15T08:34:41.293
2023-06-15T08:34:41.293
32281
32281
question
windows powershell cmd
Powershell上でmosquitto_pubを " 使ったpublishメッセージに”文字を送りたい。
UNIX系OSはshellがコマンドライン引数を解釈し、グロブ展開（`*.txt`などを実ファイル名に展開）してからプロセスが起動されます。  
しかし、Windowsではshellにそのような機能がないため、各プロセスのスタートアップルーチンがコマンドライン引数を解釈し、グロブ展開を行います。その上で、shell（`cmd.exe`;コマンドプロンプトやPowerShell）は各プロセスのスタートアップルーチンを邪魔しないようにコマンドライン引数を解釈しています。  
要するに、 **コマンドライン引数は２段階で解釈されるため、それを見越してコマンドライン入力する必要があります** 。

* * *

> コマンドプロンプトでは、
```

>     .\mosquitto_pub -h test.mosquitto.org -t spresense/mqtt -m
> "{\"test\":10}"
>  
```

>
> で送ることができ、subscriberは、 `{"test":10}` と解釈できています。

`cmd.exe`のエスケープ文字は`^`です。`^`が含まれていない以上、`cmd.exe`に渡した引数はそのままプロセスに渡されます。つまり`.\mosquitto_pub`が受け取るコマンドライン引数は

```

    -h test.mosquitto.org -t spresense/mqtt -m "{\"test\":10}"
    
```

です。PowerShellでこのコマンドライン引数を再現するためには

```

    .\mosquitto_pub -h test.mosquitto.org -t spresense/mqtt -m "{\`"test\`":10}"
    
```

辺りでどうでしょうか？ （[PowerShellのエスケープ文字は ` です](https://learn.microsoft.com/ja-
jp/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7.3)）

これでダメな場合、外側の`"`も保持するように

```

    .\mosquitto_pub -h test.mosquitto.org -t spresense/mqtt -m "`"{\`"test\`":10}`""
    
```

とする必要があるかもしれません。
CC BY-SA 4.0
2023-06-15T07:52:51.787
95246
2023-06-15T07:52:51.787
4236
95243
answer