将setCaseSensitiveInfo递归应用于所有文件夹和子文件夹

时间:2018-07-30 09:40:20

标签: powershell

我试图将我的dotnet核心项目(在Windows中)配置为“区分大小写”,因此其行为与在生产服务器(Linux)中一样。

我有found this way这样做:

fsutil.exe file setCaseSensitiveInfo "C:\my folder" enable

问题在于此函数不是递归的:

  

区分大小写标志仅影响您将其应用到的特定文件夹。该文件夹的子文件夹不会自动继承该文件。

因此,我正在尝试构建一个Powershell脚本,将该脚本以递归方式应用于所有文件夹和子文件夹。

我曾尝试使用类似的工具搜索并只是修改了命令行,但似乎没有找到corrent关键字。这是此类示例的the closest that I've gotten

4 个答案:

答案 0 :(得分:12)

正确的代码:

(Get-ChildItem -Recurse -Directory).FullName | ForEach-Object {fsutil.exe file setCaseSensitiveInfo $_ enable}

说明:

Get-ChildItem -Recurse -Directory将为您提供所有文件夹的列表(递归)。

要传递其完整路径,可以使用.FullName(或更多不言自明的| Select-Object -ExpandProperty FullName)进行访问。

然后,您使用ForEach-Object多次运行fsutil.exe。可以使用FullName(代表$_中的当前对象)访问当前文件的ForEach-Object

答案 1 :(得分:2)

使用Cygwin和bash shell,您可以执行以下操作:

$ find $THEDIR -type d -exec fsutil file setCaseSensitiveInfo "{}" enable \;

看来Windows可以很好地处理find命令输出的'/'字符。

答案 2 :(得分:1)

(Get-ChildItem -Recurse -Directory).FullName | ForEach-Object {if (-Not ($_ -like '*node_modules*')) { fsutil.exe file setCaseSensitiveInfo $_ enable } }

我修改了@robdy的代码,以允许排除node_modules。您可以使用任何内容替换上面的“ node_modules”位,以排除包含它的文件路径。

如果您正在使用npm,则可能要排除node_modules。 @robdy的answer很棒,但是即使我没有安装软件包,一次遍历每个单节点软件包文件夹也要花费几分钟。鉴于这是一个人们可能经常希望运行的东西,因为可能一直在添加目录,并且由于您可能没有在node_modules中进行任何修改,因此似乎很合理。

答案 3 :(得分:1)

就我而言,在使用fsutil工具之前,我必须首先启用Linux子系统。所以我的步骤是:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

然后重新启动,然后是@robdy的解决方案:

(Get-ChildItem -Recurse -Directory).FullName | ForEach-Object {fsutil.exe file setCaseSensitiveInfo $_ enable}