我需要将 Azure 存储 blob 的完整 URI(带有 SAS 令牌)从变量写入文件,并在后续运行脚本时(在重新启动的另一侧)将其读出。由于 SAS 令牌 URI 至少包含一个 & 符号,因此输出到文件中的变量在第一个 & 符号处被截断;
$sasTokenURI | out-file "c:\sasTokenURI.txt"
写入 URI 直到第一个 & 符号(不包括)。
我如何强制 Powershell 将 URI 逐字输出到文件,然后稍后逐字读取?
答案1
我不确定我的理解是否正确,如果我的答案有误,请指出。以下步骤对我有用,也许你可以检查一下。
$StorageAccountName = "shuilinuxdiag336"
$StorageAccountContext = (Get-AzureRmStorageAccount | Where-Object{$_.StorageAccountName -eq $StorageAccountName}).Context
$StorageContainerName = "customscriptfiles"
$StartTime = Get-Date
$EndTime = (Get-Date).AddHours(4)
$blobName = "install_nginx_ubuntu.sh"
$SASURI = New-AzureStorageBlobSASToken -Container $StorageContainerName `
-Blob $blobName `
-Context $StorageAccountContext `
-Permission "rwd" `
-StartTime $StartTime `
-ExpiryTime $EndTime `
-FullUri
$SASURI | out-file "C:\Users\v-shshui\test.txt"
$sasTokenURI = cat "C:\Users\v-shshui\test.txt"
Invoke-WebRequest -Uri $sasTokenURI -OutFile $blobName
我在我的实验室中测试,它对我有用。
答案2
看起来 URI 并没有被安装脚本截断,而是在通过模板传递给安装脚本时被截断了。Powershell 中的 & 符号被保留用于某些神秘的未来用途。
我通过始终使用 .replace("&","@") 并仅在调用 Web 请求之前反转替换来阻止它(对于遇到同样问题的人)。现在它工作正常。