2nd chunk of `content/manuals/extensions/extensions-sdk/guides/invoke-host-binaries.md`
82f6985e22dd861f05c87aaa966557c7db1ea44c6b28c65c0000000100000cc5
echo "Hello, $1!"
```
{{< /tab >}}
{{< tab name="Windows" >}}
Create a `batch script` for Windows in another file `binaries/windows/hello.cmd` with the following content:
```bash
@echo off
echo "Hello, %1!"
```
{{< /tab >}}
{{< /tabs >}}
Then update the `Dockerfile` to copy the `binaries` folder into the extension's container filesystem and make the
files executable.
```dockerfile
# Copy the binaries into the right folder
COPY --chmod=0755 binaries/windows/hello.cmd /windows/hello.cmd
COPY --chmod=0755 binaries/unix/hello.sh /linux/hello.sh
COPY --chmod=0755 binaries/unix/hello.sh /darwin/hello.sh
```
## Invoke the executable from the UI
In your extension, use the Docker Desktop Client object to [invoke the shell script](../dev/api/backend.md#invoke-an-extension-binary-on-the-host)
provided by the extension with the `ddClient.extension.host.cli.exec()` function.
In this example, the binary returns a string as result, obtained by `result?.stdout`, as soon as the extension view is rendered.
{{< tabs group="framework" >}}
{{< tab name="React" >}}
```typescript
export function App() {
const ddClient = createDockerDesktopClient();
const [hello, setHello] = useState("");
useEffect(() => {
const run = async () => {
let binary = "hello.sh";
if (ddClient.host.platform === 'win32') {
binary = "hello.cmd";
}
const result = await ddClient.extension.host?.cli.exec(binary, ["world"]);
setHello(result?.stdout);
};
run();
}, [ddClient]);
return (
<div>
{hello}
</div>
);
}
```
{{< /tab >}}
{{< tab name="Vue" >}}
> [!IMPORTANT]
>
> We don't have an example for Vue yet. [Fill out the form](https://docs.google.com/forms/d/e/1FAIpQLSdxJDGFJl5oJ06rG7uqtw1rsSBZpUhv_s9HHtw80cytkh2X-Q/viewform?usp=pp_url&entry.1333218187=Vue)
> and let us know if you'd like a sample with Vue.
{{< /tab >}}
{{< tab name="Angular" >}}
> [!IMPORTANT]
>
> We don't have an example for Angular yet. [Fill out the form](https://docs.google.com/forms/d/e/1FAIpQLSdxJDGFJl5oJ06rG7uqtw1rsSBZpUhv_s9HHtw80cytkh2X-Q/viewform?usp=pp_url&entry.1333218187=Angular)
> and let us know if you'd like a sample with Angular.
{{< /tab >}}
{{< tab name="Svelte" >}}
> [!IMPORTANT]
>
> We don't have an example for Svelte yet. [Fill out the form](https://docs.google.com/forms/d/e/1FAIpQLSdxJDGFJl5oJ06rG7uqtw1rsSBZpUhv_s9HHtw80cytkh2X-Q/viewform?usp=pp_url&entry.1333218187=Svelte)
> and let us know if you'd like a sample with Svelte.
{{< /tab >}}
{{< /tabs >}}
## Configure the metadata file
The host binaries must be specified in the `metadata.json` file so that Docker Desktop copies them on to the host when installing
the extension. Once the extension is uninstalled, the binaries that were copied are removed as well.
```json
{
"vm": {
...
},
"ui": {
...
},
"host": {
"binaries": [
{
"darwin": [
{
"path": "/darwin/hello.sh"
}
],
"linux": [
{
"path": "/linux/hello.sh"
}
],
"windows": [
{
"path": "/windows/hello.cmd"
}
]
}
]
}
}
```
The `path` must reference the path of the binary inside the container.