gsutil rsync 排除模式不适用于 Windows Powershell

gsutil rsync exclude patterns not working on Windows Powershell

我正在尝试在 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 有说明使用 ^ 作为转义字符而不是 \ 并转义 | 字符。我错过了什么?

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

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

  • 奇怪的是,gsutil 另外需要cmd.exe个元字符^转义, 不考虑调用 shell 和原始引用 ,在这种情况下意味着 | 必须转义为 ^|

    • 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} 表示 @ 个字符。)

由于它是一个 .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:path += ';c:\gsutil'
$env:pathext += ';.py'  
gsutil.py -m rsync -x '.*^.gz$^|.*^.scss$^|.*^.less$^|.*^.pdf$^|.*^.zip$' -d -r ./ gs://BUCKET

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