【问题标题】:gsutil rsync exclude patterns not working on Windows Powershellgsutil rsync 排除模式不适用于 Windows Powershell
【发布时间】:2020-01-24 22:42:37
【问题描述】:

我正在尝试在 powershell 中使用 gsutil rsync 将文件复制到 gs 存储桶,忽略了一些文件扩展名,但我收到错误消息,指出 '.*.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.

documentation 指示使用 ^ 作为转义字符而不是 \ 并转义 | 字符。我错过了什么?

【问题讨论】:

  • this >>> NOTE: When using this on the Windows command line, use ^ as an escape character instead of \ and escape the | character.
  • @Lee_Dailey,是的。它在cmd中也不起作用。
  • 是的,powershell 正在尝试解释双引号中的 $,所以请改用单引号。
  • @js2010 单引号也一样。
  • 请注意,gsutil.cmd 是一个 .bat 脚本。我相信这些引用问题之前已经出现过。

标签: windows powershell escaping parameter-passing gsutil


【解决方案1】:
  • 使用单引号 ('...'),可防止 PowerShell 解释字符串,尤其是 $ 字符。在里面。

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

  • 奇怪的是,gsutil 另外要求 cmd.exe 元字符是 ^-escaped无论调用 shell 和原始引用如何 em>,在这种情况下意味着 | 必须转义为 ^|

    • js2010 提到了可能的原因:gsutil 可执行文件是 gsutil.cmd,即它被实现为 (cmd.exe) 批处理文件 - 虽然显然写得不好一。

    • AndyO 报告如果您创建自定义的gsutil.cmd 批处理文件,包含以下内容,则可以避免该问题(假设python.exe 在PATH 中并且是正确的版本):
      @python.exe "C:\path\to\gsutil.py" %*

# From PowerShell
gsutil -m rsync -x '.*\.gz$^|.*\.scss$^|.*\.less$^|.*\.pdf$^|.*\.zip$' -d -r ./ gs://BUCKET

此外,您的正则表达式可以简化:

# From 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} 用于 @ 字符。)

【讨论】:

    【解决方案2】:

    因为它是一个 .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
    

    EDIT2:

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

    $env:path += ';c:\gsutil'
    $env:pathext += ';.py'  
    gsutil.py -m rsync -x '.*^.gz$^|.*^.scss$^|.*^.less$^|.*^.pdf$^|.*^.zip$' -d -r ./ gs://BUCKET
    

    使用 $env:pathext 调用 .py 文件不会打开新窗口:https://superuser.com/questions/437790/run-python-scripts-in-powershell-directly

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 2016-02-15
      • 2019-01-14
      • 2022-07-10
      • 2019-02-22
      • 2017-12-06
      • 2022-01-15
      • 2021-09-07
      • 2015-02-02
      相关资源
      最近更新 更多