gsutil rsync排除不在Windows Powershell上工作的模式

gsutil rsync排除不在Windows Powershell上工作的模式,windows,powershell,escaping,parameter-passing,gsutil,Windows,Powershell,Escaping,Parameter Passing,Gsutil,我试图在powershell中使用gsutil rsync将文件复制到gs bucket,忽略了一些文件扩展名,但收到的错误是“*.scss”不是命令: PS W:\> gsutil -m rsync -x ".*^.gz$^|.*^.scss$^|.*^.less$^|.*^.pdf$^|.*^.zip$" -d -r ./ gs://BUCKET '.*.scssecho' is not recognized as an internal or external command ope

我试图在powershell中使用gsutil rsync将文件复制到gs bucket,忽略了一些文件扩展名,但收到的错误是“*.scss”不是命令:

PS W:\> gsutil -m rsync -x ".*^.gz$^|.*^.scss$^|.*^.less$^|.*^.pdf$^|.*^.zip$" -d -r ./ gs://BUCKET
'.*.scssecho' is not recognized as an internal or external command
operable program, or a batch file.

# With the originally proposed solution:
PS W:\> gsutil -m rsync -x '.*\.(gz|scss|less|pdf|zip)$' -d -r ./ gs://BUCKET
'scss' is not recognized as an internal or external command,
operable program, or a batch file.
具有将
^
用作转义字符而不是
\
的说明,并对
\
字符进行转义。我错过了什么?

  • 使用单引号(
    “…”
    ),这会阻止PowerShell解释字符串,尤其是
    $
    字符。在里面

  • 由于要将正则表达式传递给
    rsync
    ,因此请使用通常的
    \
    -转义来转义正则表达式元字符,例如

  • 奇怪的是,
    gsutil
    还要求
    cmd.exe
    元字符被
    ^
    -转义
    ,而不考虑调用shell和原始引用,这意味着
    必须作为
    ^
    转义

    • 提到了可能的原因:
      gsutil
      可执行文件是
      gsutil.cmd
      ,也就是说,它被实现为(
      cmd.exe
      )批处理文件-尽管显然是一个写得很差的批处理文件

    • 报告说,如果使用以下内容创建自定义
      gsutil.cmd
      批处理文件,则可以避免问题(假定
      python.exe
      位于路径中并且是正确的版本):
      @python.exe“C:\path\to\gsutil.py”%*

来自PowerShell的
#
gsutil-m rsync-x'.*\.gz$^ |.\.scss$^ |.\.less$^ |.\.pdf$^ |.\.zip$'-d-r./gs://BUCKET
此外,您的正则表达式可以简化:

来自PowerShell的
#
gsutil-m rsync-x'.*\(gz^ scss^ less^ pdf^ zip)$'-d-r./gs://BUCKET

转义和引用的一般要点:

只有在
cmd.exe
中,
^
才充当转义字符;在PowerShell中,它是
`
(倒勾)

还要注意的是,在
cmd.exe
中,您只需要在不带引号的参数中使用
^
,而不需要在
“…
中使用

在PowerShell中,
“…”
字符串按字面意思(逐字)表示,不需要转义(除了
本身为


“…”
内部,必须使用可扩展字符串
`
有选择地转义
$
字符作为文本,并且您还可以使用转义序列,例如
`n
来嵌入控制字符(在本例中为新行),在PowerShell[Core]6+中,此外,要通过其代码点嵌入Unicode代码字符(例如,
@
字符的
`u{40}

由于它是一个.cmd脚本,您也可以从cmd或.bat文件运行它,就像它是为

编辑:所以它是一个调用python脚本的.cmd脚本。如果改为调用此文件而不是.cmd文件,它可能会工作得更好:

# gsutil.ps1
c:\python27\python.exe c:\gsutil\gsutil $args
因此,单引号:

.\gsutil.ps1 -m rsync -x '.*^.gz$^|.*^.scss$^|.*^.less$^|.*^.pdf$^|.*^.zip$' -d -r ./ gs://BUCKET
编辑2:

直接运行python脚本。(如果gsutil.cmd被隐藏,则可以删除.py。)


使用$env:pathext,因此调用.py文件不会打开新窗口:

此>>
注意:在Windows命令行上使用此命令时,请将“^”用作转义字符,而不是\并转义“;字符。
@Lee\u Dailey,是的。它在cmd.Yep中也不起作用,powershell正在尝试解释双引号中的$,因此请改用单引号。@js2010单引号也是一样。请注意,gsutil.cmd是一个.bat脚本。我相信这些引用问题以前也曾出现过。
$env:path += ';c:\gsutil'
$env:pathext += ';.py'  
gsutil.py -m rsync -x '.*^.gz$^|.*^.scss$^|.*^.less$^|.*^.pdf$^|.*^.zip$' -d -r ./ gs://BUCKET