使文件将powershell输出存储在一个变量中以备将来使用



系统:Win10与MinGW制作

我正试图将PowerShell输出存储在配方中的一个变量中,不幸的是,我已经用尽了所有选项。

存储powershell命令的变量:

# Get newest package in the directory
LST_PKG := powershell "gci -Path . -File *.nipkg -Recurse -Name | sort creationtime | Select -First 1"

输出为buildspackagessrl-lut_1.2.0.32_windows_all.nipkg

不起作用的实际配方(PKG_REL_PATH最终为空(:

.PHONY: publish
publish: clean build package
ifeq ($(DEBUG), 1)
@echo "Publishing a DEBUG package..."

#1. Copy package to feed repo
$(eval PKG_REL_PATH = $(LST_PKG))
cp $(ROOT_DIR)$(PKG_REL_PATH) $(TEST_FEED_REPO)

#2. Publish the package

else
@echo "Publishing a RELEASE package..." 
endif

表明问题的部分输出:

"Publishing a DEBUG package..."
cp C:UsersPublicProjectsSRLlutsrcpowershell "gci -Path . -File *.nipkg -Recurse -Name | sort creationtime | Select -First 1" \raven#RavenSRLFeedsSRLRepo
'cp' is not recognized as an internal or external command,
operable program or batch file.
make: *** [makefile:78: publish] Error 1

看起来LST_PKG没有扩展和求值,只是作为字符串分配给PKG_REL_PATH:cp C:\Users\Public\Projects\SRL\lut\src*powershell"gci-路径-文件.nipkg-重复-名称|排序创建时间|选择-第一个1">\raven\#raven\SRLFeeds\SRL\Repo

  1. 在配方中使用make函数(如eval(通常是错误的
  2. 您的eval只是创建一个名为PKG_REL_PATH的make变量LST_PKG的副本,它不执行powershell命令
  3. 您收到的错误消息似乎表明make在shell中没有用于执行配方的cp命令。这很奇怪。你知道贝壳有什么用吗

假设你找到了解决第三个问题的方法,你可以简单地尝试:

# Get newest package in the directory
LST_PKG := powershell "gci -Path . -File *.nipkg -Recurse -Name | sort creationtime | Select -First 1"
PKG_REL_PATH := $(shell $(LST_PKG))

shellmake函数将把powershell命令传递给shell。shell将执行它,并且输出将被分配给PKG_REL_PATHmake变量。这将在make解析Makefile时发生。如果你绝对希望这个命令与publish配方同时执行,那么你需要的很可能是一个shell变量:

publish: clean build package
ifeq ($(DEBUG), 1)
@echo "Publishing a DEBUG package..."
PKG_REL_PATH=$$($(LST_PKG)); 
cp $(ROOT_DIR)"$$PKG_REL_PATH" $(TEST_FEED_REPO)    
else
@echo "Publishing a RELEASE package..." 
endif

请注意,$$通过生成并将$(powershell ...)$PKG_REL_PATH传递到外壳来逃避第一次扩展。如果没有这一点,make的第一次扩展将吃掉$,而传递到shell的内容将不是您想要的。

还要注意shell命令与分号和行连续符的链接。它们是绝对需要的,以保证这两个命令在同一个shell中执行。默认情况下,配方行在不同的shell调用中执行(除非您使用GNUmake.ONESHELL功能(,并且在一行中定义的shell变量在下一行中未定义。因此,如果没有链接和行延续,PKG_REL_PATHshell变量将不会在cp...行中定义。

找到了一个解决方案。首先,我定义了一个CMD类型的复制命令,用于cp(在makefile的开头,在所有配方之外:

# Copy a file from targed to destination
_CP = cmd /C copy

通过执行以下操作归档了正确的扩展:

publish:
ifeq ($(DEBUG), 1)
@echo "Publishing a DEBUG package..."

#1. Copy package to feed repo
$(_CP) "$(ROOT_DIR)$(shell $(_LST_PKG))" "$(TEST_FEED_REPO)"
#2. Publish the package
else
@echo "Publishing a RELEASE package..." 
endif

publish: clean build package
ifeq ($(DEBUG), 1)
@echo "Publishing a DEBUG package..."

#1. Copy package to feed repo
$(eval PKG_REL_PATH = $(LST_PKG))
cp $(ROOT_DIR)$(PKG_REL_PATH) $(TEST_FEED_REPO)

#2. Publish the package

else
@echo "Publishing a RELEASE package..." 
endif

总之,我使用了$(shell ...)内联求值来绕过所有变量赋值,这首先导致了问题的出现。

最新更新