Используйте одинарные кавычки ('...'
), что не позволяет PowerShell интерпретировать строку, особенно символы $
.в этом.
Поскольку вы передаете регулярное выражение в rsync
, используйте обычный \
-экранирование для экранирования regex метасимволов, таких как .
Странно, gsutil
дополнительно требует, чтобы cmd.exe
метасимволы были ^
-экранированными , независимо от вызывающей оболочки иоригинальная цитата , которая в данном случае означает, что |
необходимо экранировать, так как ^|
- js2010 указывает на вероятную причину:
gsutil
исполняемый файл gsutil.cmd
, то есть он реализован как (cmd.exe
) пакетный файл - хотя, по-видимому, плохо написан.
# 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 '...'
строки воспринимаются буквально (дословно) и вообще не требуют экранирования (за исключением '
как ''
).
Внутри "..."
, расширяемые строки, `
должен использоваться для выборочного экранирования $
символов, которые должны быть взяты в качестве литералов, и вы также можете использовать escape-последовательности, такие как `n
, для встраивания управляющих символов (в данном случае это новая строка) и,в PowerShell Core дополнительно для вставки символов кода Unicode по их кодовой точке (например, `u{40}
для @
символа.)