【问题标题】:Appcmd from Bash script replacing backslashes with forward slashes, how to prevent?Bash脚本中的Appcmd用正斜杠替换反斜杠,如何防止?
【发布时间】:2016-05-15 11:54:52
【问题描述】:

我正在尝试运行Bash 脚本,该脚本调用appcmd 将站点添加到IIS。

#!/bin/bash

windir=c:\\windows
domain="$1"
path="$2"

#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 时,网站的物理路径属性是使用 正斜杠 而不是反斜杠设置的。

我做错了什么?

【问题讨论】:

  • 尝试改变你的 sed 模式也许是sed 's!\/!\\!g'
  • 这会产生错误:sed: -e expression #1, char 8: unterminated s' command`
  • @l'L'l:这会产生相同的错误。但是我的sed 部分实际上并没有产生错误,我echo $physicalPath 的值被替换了。只是在IIS 中会出现它看不懂的正斜杠
  • 我确实注意到了一些事情,我认为你很接近;在许多示例中,物理路径之前有一个-...所以可能是-PhysicalPath:"C:\ $path",或-PhysicalPath:"$env:systemdrive\"$path,或/[path='/'].physicalPath:%SystemDrive%\$path...
  • 这确实有效!谢谢! - 非常奇怪(混合/- 分隔符)我现在将其作为工作命令:$windir\\syswow64\\inetsrv\\appcmd add site /name:$domain -physicalpath:$physicalPath /bindings:http/*:80:$domain

标签: bash backslash appcmd


【解决方案1】:

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

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

因此,您需要转义反斜杠本身才能按字面意思使用它们。每对 \\ 都被 shell 视为单个文字 \

windir=c:\\\\windows
domain="$1"
path="$2"

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

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

windir='c:\\windows'
domain="$1"
path="$2"

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

(你也可以使用双引号,但是由于双引号中有一些具有特殊含义的字符,可以使用反斜杠来转义它们,这意味着有时你需要转义反斜杠,有时不需要。例如:

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

)

【讨论】:

    【解决方案2】:

    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)。

    【讨论】:

    • OP 使用的是变量,而不是硬编码的字符串。
    • 我尝试了以下命令:$windir\\syswow64\\inetsrv\\appcmd set app /app.name:$domain/ /"[path='/'].physicalPath:$physicalPath"(注意:domain$/ 是 appname 并且还要注意 /"[path=...." 周围的双引号。IIS 中的物理路径仍然是正斜杠...跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2022-11-25
    • 2014-09-09
    • 2021-05-29
    相关资源
    最近更新 更多