gsutil rsync排除不在Windows Powershell上工作的模式
我试图在powershell中使用gsutil rsync将文件复制到gs bucket,忽略了一些文件扩展名,但收到的错误是“*.scss”不是命令: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
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”%*
- 提到了可能的原因:
#
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