簡體   English   中英

如何在 windows 命令提示符中設置具有多行文件內容的環境變量

[英]How to set an env variable with multiline file content in windows command prompt

我有一個文件說my-file.dat有多行。 我想設置一個環境變量,比如MYVAR ,它將包含 my-file.dat 的內容。 也就是說,在 windows 命令提示符下, type my-file.dat的 output 與echo %MYVAR%的 output保留相同,並帶有新的

在 RHEL/MAC 中,它通常像這樣export MYVAR=$(cat my-file.dat)完成,但是我如何在 windows 命令提示符下執行類似操作(對 powershell 並不真正感興趣,但隨時分享它可能的示例成為我的備份選項)

按照這個 Stackoverflow 問題Multiline text file, how to put into an environment variable我可以得到一個變量來保存 my-file.dat 的內容。 但是這個變量的 scope 似乎是批處理文件。 即使我從命令提示符運行批處理文件,我也沒有在命令提示符中看到批處理文件的變量。

我嘗試set /P MYVAR=<my-file.dat ,但這僅設置第一行,而當我回顯 MYVAR 時我想要所有行

請幫忙。

您使用的技術需要延遲擴展,默認情況下不啟用。 所以代碼發出setlocal enableDelayedExpansion 但這會本地化環境變化。 當腳本結束時有一個隱含的endlocal ,並且環境恢復到setlocal之前的狀態。

最簡單的解決方案是在已啟用延遲擴展的 session 中運行腳本,以便您可以刪除setlocal enableDelayedExpansion 你可以簡單地通過運行來做到這一點
cmd /v:on在執行腳本之前從命令行中打開。

還有另一個簡單但丑陋的選擇。 如果您的腳本有致命的語法錯誤(我認為這是 cmd.exe 中的錯誤),則不會發生隱式 endlocal。 因此,您可以將以下內容放在腳本的末尾:

:: Your current script goes here.
:: I'm assuming your script falls through to the end and does not use EXIT /B

call :fatalErr 2>nul

:fatalErr
if

但是,如果您可能多次執行腳本,我不鼓勵您使用這種技術 - 您的死環境將開始堆積。

另外 - 請記住,變量限制為 ~8191 個字符 - 如果您嘗試捕獲的文件超出限制,您的腳本將失敗。 這是 cmd.exe 的硬限制

更新

如果添加 /K 選項,則可以將cmd /v:on命令放在腳本中。 IF 語句測試是否啟用延遲擴展。 如果不是,則它通過 cmd.exe 使用 /K 選項和 /V:ON 重新運行腳本。

@echo off
if "!!" neq "" cmd /v:on /k "%~f0"
:: rest of your script goes here.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM