Bash 脚本中的 Appcmd 将反斜杠替换为正斜杠,如何防止?

Appcmd from Bash script replacing backslashes with forward slashes, how to prevent?

我正在尝试 运行 调用 appcmdBash 脚本将站点添加到 IIS。

#!/bin/bash

windir=c:\windows
domain=""
path=""

#also tried using forward slashes by replacing backslashes
#physicalPath=`echo "$path" | sed 's/\\/\//g'`

#add site
$windir\syswow64\inetsrv\appcmd add site /name:$domain /physicalpath:$path

我调用脚本使用:

script.sh mydomain.com c:\mypath

但是,当我检查 IIS 时,站点的物理路径 属性 是使用 正斜杠 而不是反斜杠设置的。

我做错了什么?

来自 https://technet.microsoft.com/en-us/library/cc725781%28v=ws.10%29.aspx 的以下数据是否有帮助?

要更改应用程序内容的路径,请使用以下语法:

appcmd set app /app.name: string /[path='/'].physicalPath: string

变量app.namestring是应用程序的虚拟路径,physicalPathstring是应用程序内容的物理路径。

例如,要为名为 contoso 的站点中名为 marketing 的应用程序更改位置 c:\application 的物理路径,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set app /app.name: contoso / marketing /[path='/'].physicalPath:c:\ application

有关 Appcmd.exe 的详细信息,请参阅 Appcmd.exe (IIS 7)。

反斜杠用于防止对某些字符进行特殊处理:

$ z=foo
$ echo "$z"
foo
$ echo "$z"
$z

因此,您需要自己转义反斜杠才能按字面意思使用它们。 shell 将每一对 \ 视为单个文字 \.

windir=c:\\windows
domain=""
path=""

#add site
"$windir"\\syswow64\\inetsrv\\appcmd add site /name:"$domain" /physicalpath:"$path"

但是,更简单的转义方法是将它们包含在单引号中。

windir='c:\windows'
domain=""
path=""

#add site
"$windir"'\syswow64\inetsrv\appcmd' add site /name:"$domain" /physicalpath:"$path"

(也可以使用双引号,但是由于双引号中有少数字符有特殊含义,所以可以用反斜杠转义,意思是有时您需要转义反斜杠,有时则不需要。例如:

$ echo "$"
$
$ echo "\t"
\t

)