- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 PowerShell 中遇到以下行为,我无法解释并且觉得很麻烦。
我在任意目录下工作,目录路径显示在提示中:
PS C:\Users\Rene\AppData\Local\Temp>
此外,get-location
报告“正确”路径:
PS C:\Users\Rene\AppData\Local\Temp> get-location
Path
----
C:\Users\Rene\AppData\Local\Temp
然后我输入mkdir xyz | cd
以创建一个目录并将工作目录更改为这个新目录:
PS C:\Users\Rene\AppData\Local\Temp> mkdir xyz | cd
突然,提示中的路径以 Microsoft.PowerShell.Core\FileSystem::
为前缀:
PS Microsoft.PowerShell.Core\FileSystem::C:\Users\Rene\AppData\Local\Temp\xyz>
此更改也反射(reflect)在 get-location
中:
PS Microsoft.PowerShell.Core\FileSystem::C:\Users\Rene\AppData\Local\Temp\xyz> get-location
Path
----
Microsoft.PowerShell.Core\FileSystem::C:\Users\Rene\AppData\Local\Temp\xyz
这是怎么回事,我该如何关闭该前缀?
最佳答案
倒序:
How can I turn that prefix off?
很简单,使用显式管道绑定(bind)!
mkdir xyz |cd -Path {$_.FullName}
What is going on here?
好问题!您在这里看到的是提供程序 cmdlet(Get-ChildItem
、Get-Item
、Set-Location
等)实现管道绑定(bind)。
当您针对 FileSystem
提供程序调用 New-Item
(mkdir
所做的)时,它会返回一个对象(对应于新创建的文件或目录)有一堆隐藏属性,PowerShell 使用这些隐藏属性跨提供者跟踪项目 - 这些可以通过 Get-Member -Force
发现:
PS C:\> Get-Item .|Get-Member PS* -MemberType NoteProperty -Force
TypeName: System.IO.DirectoryInfo
Name MemberType Definition
---- ---------- ----------
PSChildName NoteProperty string PSChildName=C:\
PSDrive NoteProperty PSDriveInfo PSDrive=C
PSIsContainer NoteProperty bool PSIsContainer=True
PSParentPath NoteProperty string PSParentPath=
PSPath NoteProperty string PSPath=Microsoft.PowerShell.Core\FileSystem::C:\
PSProvider NoteProperty ProviderInfo PSProvider=Microsoft.PowerShell.Core\FileSystem
当您使用下游提供程序 cmdlet(例如 Set-Location
/cd
)构建管道语句时,它使用提供程序限定的 PSPath
值来绑定(bind)输入对象。
这可以通过 Trace-Command
观察到:
PS C:\> Trace-Command -Expression {Get-Item .|Set-Location} -Name ParameterBinding,MemberResolution -PSHost
这导致(为简洁起见,我删除了 Get-Item
的详细信息):
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Set-Location]
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Set-Location]
DEBUG: ParameterBinding Information: 0 : BIND cmd line args to DYNAMIC parameters.
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Set-Location]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : BIND PIPELINE object to parameters: [Set-Location]
DEBUG: ParameterBinding Information: 0 : PIPELINE object TYPE = [System.IO.DirectoryInfo]
DEBUG: ParameterBinding Information: 0 : RESTORING pipeline parameter's original values
DEBUG: ParameterBinding Information: 0 : Parameter [Path] PIPELINE INPUT ValueFromPipeline NO COERCION
DEBUG: ParameterBinding Information: 0 : BIND arg [C:\\] to parameter [Path]
DEBUG: ParameterBinding Information: 0 : BIND arg [C:\\] to param [Path] SKIPPED
DEBUG: ParameterBinding Information: 0 : Parameter [Path] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
DEBUG: MemberResolution Information: 0 : Lookup
DEBUG: MemberResolution Information: 0 : "Path" NOT present in type table.
DEBUG: MemberResolution Information: 0 : Adapted member: not found.
DEBUG: ParameterBinding Information: 0 : Parameter [StackName] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
DEBUG: MemberResolution Information: 0 : Lookup
DEBUG: MemberResolution Information: 0 : "StackName" NOT present in type table.
DEBUG: MemberResolution Information: 0 : Adapted member: not found.
DEBUG: ParameterBinding Information: 0 : Parameter [LiteralPath] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
DEBUG: MemberResolution Information: 0 : Lookup
DEBUG: MemberResolution Information: 0 : "LiteralPath" NOT present in type table.
DEBUG: MemberResolution Information: 0 : Adapted member: not found.
DEBUG: MemberResolution Information: 0 : Lookup
DEBUG: MemberResolution Information: 0 : Found PSObject instance member: PSPath.
DEBUG: ParameterBinding Information: 0 : BIND arg [Microsoft.PowerShell.Core\FileSystem::C:\] to parameter [LiteralPath]
DEBUG: ParameterBinding Information: 0 : BIND arg [Microsoft.PowerShell.Core\FileSystem::C:\] to param [LiteralPath] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Set-Location]
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing
如您所见,PowerShell 放弃将 C:\
绑定(bind)到 Set-Location
的 -Path
参数,以某种方式绑定(bind) PSPath
属性值改为-LiteralPath
更合适?!
原因是 -LiteralPath
参数是 PSPath
的别名,通过使用 Get-Command
挖掘一下可以看出>:
PS C:\> (Get-Command Set-Location).Parameters['LiteralPath'] |Select Aliases
Aliases
-------
{PSPath}
提供程序 cmdlet 的管道绑定(bind)以这种方式实现的真正原因是双重的:
Path
可能会产生与globbing 相关的意外后果
Get-Item -Path 'a[bcd]'
和 Get-Item -LiteralPath 'a[bcd]'
是两个截然不同 例如查询PSPath
值意味着我们可以在不丢失自动绑定(bind)的情况下将位置切换到不同的提供者:
PS 证书:\> $aFile |Get-Content
正常工作关于PowerShell 开始在文件路径前添加 Microsoft.PowerShell.Core\FileSystem::,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60871093/
有没有办法确定我是否可以使用标准 (在所有支持 C++17 的现代 C++ 编译器上可用)或 由较旧的编译器使用。 (例如 g++ 6.3,这是 Debian Stretch 上的当前标准版本) 知
因此,boost::filesystem 允许您在文件所有者拥有的权限、组拥有的权限以及所有用户拥有的权限的意义上访问文件的权限。这很好,但我不想开始检查我是谁,我的组是什么等等——我只想检查我是否可
我不小心使用 rm -rf 删除了错误的文件夹,我尝试过的每个工具都告诉我我没有硬盘或找不到文件系统。 当我输入 df 时,我得到: 已使用的文件系统大小 Avail Use% Mounted on
我是 Java 的新手,正在尝试学习 IO 的概念。我遇到过两个非常相似的 Java 类,FileSystem 和 FileSystems。它们之间有什么区别?什么时候使用一个而不是另一个? 最佳答案
我查了很多关于c++17下文件系统链接的问题,还是无法链接成功。我的main.cpp文件如下。 #include int main(int argc, char** argv) { std:
Boost 库有一个类来处理文件路径:boost::filesystem::path。Boos 也有这个类 boost::filesystem::wpath 每个类都有方法string(), wstr
我正在编写一个利用 std::filesystem 的库(仅供学习)。它在 MSVC 上运行良好,但是默认情况下,Linux 的 LTS 版本就像 Ubuntu 一样附带 GCC 6.x,官方存储库中
请查找随附的代码片段。我正在使用此代码将文件从 hdfs 下载到我的本地文件系统 - Configuration conf = new Configuration(); FileSys
这段代码中std::filesystem::copy()和std::filesystem::copy_file()有什么区别? #include void testing() { const
以下代码旨在去除路径的第一部分,以防它存在: #include std::filesystem::path strip_prefix(std::filesystem::path p) {
在以下两种情况下,是否有理由调用lexically_normal: std::filesystem::path filepath = someFuntionThatGetsAPath(); filep
函数 boost::filesystem::canonical() ( doc of 1.66 , doc of current release ) 提供两个参数(忽略错误代码重载)base。第一个是
boost::filesystem::path使用 &转义路径字符串中的引号,see demo : std::cout 标题。 最佳答案 Boost::Filesystem 相当古老,早于 C++14
考虑以下关于路径分解的断言,其中每个局部变量,例如stem 具有明显的初始化,例如auto stem = path.stem() — assert(root_path == root_name / r
给定以下代码: fs::path p{ "a/b/" }; fs::path q{ "a/b/." }; assert(p == q); [注意定义 q 的字符串末尾的额
由于 C++17 std::filesystem 与 boost::filesystem 非常相似,所以我尝试做与这个问题相同的事情: Escaping some Directories in ite
我找到了这个页面,描述了 c++14 和 c++17 之间的变化: https://isocpp.org/files/papers/p0636r0.html ... 它链接到此页面,该页面描述了建议的
我有一些代码,当我编译它时,出现以下错误,我不知道如何解决。我尝试添加 -L/usr/lib/x86_64-linux-gnu、-lboost_system 和 -lboost_filesystem,
尝试使用 Asset.loadAsync 将 .txt Assets 作为字符串加载到 Expo 中 Asset.loadAsync(module) 解析并提供一个 localUri 但是,FileS
我在 中编码C++ 在 Visual Studio (Windows 10)并收到此错误: #error The header providing std::experimental::filesy
我是一名优秀的程序员,十分优秀!