免责声明:我对PowerShell越来越熟悉了,但我对PowerShell还相当缺乏经验。
我想使用PowerShell和here-string语法一起编写pip.ini
和.condarc
配置文件,分别使用Python包管理器pip, conda。有了.condarc
,没有错误,但我认为我必须在Notepad++
中再次重写它才能真正使其工作-我认为这是一个文件编码问题:
mkdir 'C:ProgramDataconda.condarc'
echo @"
show_channel_urls: true
allow_other_channels: false
report_errors: false
remote_read_timeout_secs: 120
"@ > C:ProgramDataconda.condarc
下面给出了pip.ini的错误,因为[global]:
mkdir 'C:ProgramDatapippip.ini'
echo @"
[global]
index = https://xxxx/nexus/repository/xxxx/pypi
index-url = https://xxxx:8443/nexus/repository/xxxx/simple
trusted-host = xxxx:8443
"@ > C:ProgramDatapippip.ini
Get-Content pip.ini
运行良好,但pip config list -v
返回:
PS C:Program Files> pip config list -v
Configuration file could not be loaded.
File contains no section headers.
file: 'C:\ProgramData\pip\pip.ini', line: 1
'ÿþ[x00gx00lx00ox00bx00ax00lx00]x00n'
备注:xxxx代表公司敏感信息,以原文代替。
我也尝试转义带有'的方括号,但是没有成功。
是否有一种方法来指定一些文件编码像上面的UTF-8或问题可以以某种方式解决在另一种自动化的方式?
在Windows Powershell中,重定向操作符使用 Unicode
编码(换句话说,使用小端字节顺序的UTF-16))。这就是为什么您会看到这种奇怪的文件内容。
- 从PowerShell Core运行代码(
pwsh.exe
),或 - 使用
Out-File
cmdlet和它的Encoding
参数代替>
重定向器。
但是,请注意Windows PowerShell倾向于使用以下代码片段添加UTF-8字节顺序标记:
$MyRawString = @"
[global]
index = https://xxxx/nexus/repository/xxxx/pypi
index-url = https://xxxx:8443/nexus/repository/xxxx/simple
trusted-host = xxxx:8443
"@
$MyPath = "C:ProgramDatapippip.ini"
$MyRawString | Out-file -FilePath $MyPath -Encoding utf8
Windows PowerShell
解决方案. 使用。net的UTF8Encoding
类并将$False
传递给构造函数似乎可以工作(从这个M中偷来的)。达德利的答案):
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
[System.IO.File]::WriteAllLines($MyPath, $MyRawString, $Utf8NoBomEncoding)
Get-Help About_Redirection
- Windows PowerShell (
powershell.exe
)
当你写入文件时,重定向操作符使用
Unicode
编码。如果文件具有不同的编码,则输出可能不是格式化正确。要将内容重定向到非unicode文件,请使用Out-File
cmdlet及其Encoding
参数
- PowerShell核心(
pwsh.exe
, version 6+)
当您写入文件时,重定向操作符使用
UTF8NoBOM
编码。如果文件具有不同的编码,则输出格式可能不正确。用不同的类型写入文件编码,使用Out-File
cmdlet及其Encoding
参数。
注意有一个错误在PowersShell 5.1的About_Redirection
帮助主题的在线版本中…
Out-File
在Windows PowerShell 5.1默认是Unicode在PowerShell Core 7+它是UTF8。
你正在使用mkdir
创建一个对我没有意义的文件。
无论如何都不需要预先创建文件。因此,结合上面的内容,可以像这样:
@"
show_channel_urls: true
allow_other_channels: false
report_errors: false
remote_read_timeout_secs: 120
"@ | Out-File C:ProgramDataconda.condarc
@"
[global]
index = https://xxxx/nexus/repository/xxxx/pypi
index-url = https://xxxx:8443/nexus/repository/xxxx/simple
trusted-host = xxxx:8443
"@ | Out-File C:ProgramDatapippip.ini